昨天刚刚完成老师布置的一个Web小项目,项目中用到了两个过滤器(编码过滤、登录过滤)
比如电商网页中有些不需要登录也能访问(首页、商品详细信息...),其他都需要过滤在会话作用域(session)中是否含有个人信息对象
示例代码:
package com.star.miniShop.Filter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/*")
public class LoginFiter implements Filter{
//实例化一个静态的集合
private static List urls = new ArrayList<>();
//静态代码块中向集合中存放所有可以放行的请求或网页地址(不用账号密码即可访问)
static {
urls.add("/logining");
urls.add("/shopLogin.html");
urls.add("/css");
urls.add("/js");
urls.add("/images");
urls.add("/shopHome.html");
urls.add("/HomeShop");
urls.add("/Searchs");
urls.add("/regist");
urls.add("/shopRegist.html");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
/**
* 拦截请求,看看用户是否登陆,如果没有登陆,
* 则跳转回登录页面,否则就放行
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//注意:ServletRequest是HttpServletRequest父接口,因此需要强转
//同样,ServletResponse是HttpServletResponse父接口,因此需要强转
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
//得到当前页面所在目录下全名称
String urlPattern=req.getServletPath();
//得到页面所在服务器的绝对路径
String path = req.getRequestURI();
//System.out.println(urlPattern);
for (String url : urls) {
if(url.equals(urlPattern) || path.contains(url)) {
// System.out.println("reaource do chain...");
chain.doFilter(request, response);
//防止重复响应
return;
}
}
//如果person为null,表示没有登录
if(req.getSession().getAttribute("person")==null) {
res.sendRedirect("shopLogin.html");
}else {
//放行
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}