packagecom.star.miniShop.Filter;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;
@WebFilter("/*")public class LoginFiter implementsFilter{//实例化一个静态的集合(这里可以改用map集合,提高性能,每次过滤可以不用for匹配)
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");
}
@Overridepublic voiddestroy() {//TODO Auto-generated method stub
}/*** 拦截请求,看看用户是否登陆,如果没有登陆,
* 则跳转回登录页面,否则就放行*/@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain)throwsIOException, 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);
}
}
@Overridepublic void init(FilterConfig arg0) throwsServletException {//TODO Auto-generated method stub
}
}