一、过滤器Filter
拦截对资源的请求,从而实现一些特殊的功能。
二、过滤器使用步骤
1.定义类,实现Filter接口,并重写其所有方法,这里实现的接口选择javax.Servlet的Filter接口
public class FilterDemo implements Filter{
public void init(FilterConfig filterConfig){};
public void doFilter(ServletRequest request,ServletResponse servletResponse, FilterChain filterChain){};
public void destory(){};
}
2.配资Filter拦截资源的路径:在类上定义@WebFilter注解
@WebFilter("/*")
public class FilterDemo implements Filter{
public void init(FilterConfig filterConfig){};
public void doFilter(ServletRequest request,ServletResponse servletResponse, FilterChain filterChain){};
public void destory(){};
}
3.在doFilter()方法输出一句话,并放行
public void doFilter(ServletRequest request,ServletResponse servletResponse, FilterChain filterChain){
//1.放行之前的逻辑处理
System.out.println("filter 被执行了...");
//2.放行
filterChain.doFilter(request,servletResponse);
//3.放行之后的逻辑处理
};
三.Filter执行流程
执行放行前逻辑 => 放行 => 访问资源 => 执行放行后逻辑
注意:
1.放行后访问对应资源,资源访问完成后,会回到过滤器Filter中;
2.回到Filter过滤器中,是执行放行后的逻辑;
四、Filter拦截路径设置
使用注解@WebFilter("")的方式设置拦截路径
@WebFilter("/*")
public class FilterDemo implements Filter{
public void init(FilterConfig filterConfig){};
public void doFilter(ServletRequest request,ServletResponse servletResponse, FilterChain filterChain){};
public void destory(){};
}
1.拦截具体的资源:/index.jsp ,只有访问index.jsp时才会被拦截;
2.目录拦截:/user/* ,访问/user下的所有资源,都会被拦截;
3.后缀名拦截:*.jsp ,访问后缀名为.jsp的资源都会被拦截;
4.拦截所有: /* ,访问所有资源都会被拦截;
五、过滤器链
一个Web应用,可以配置多个过滤器,多个过滤器成为过滤器链。
注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序。
执行流程:先处理Filter1的放行前逻辑,在放行,访问资源结束后,去到Filter2的放行前逻辑处理,放行,访问资源结束后,执行Filter2的放行后逻辑,再到Filter1的放行后逻辑。
附上一个过滤器例子:登录和注册放行,其他路径资源请求需判断是否登录过
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
//1.判断访问资源路径是否和登录注册相关,登录注册放行
String[] urls = {"/login.jsp","/Car-CSS/","/images/","/login","/head.jsp","/register.jsp","/register","/to_register"};
//2.获取当前访问资源的路径
String url = req.getRequestURL().toString();
//3.循环判断
for (String s : urls) {
if (url.contains(s)){
//放行
filterChain.doFilter(servletRequest,servletResponse);
return;
}
}
//1.判断session域中是否有user对象
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
//2.判断user是否为null
if (user != null){
//登录过了
//放行
filterChain.doFilter(servletRequest,servletResponse);
}else {
//没有登录过
req.setAttribute("login_msg","您尚未登录!");
//没有登录过跳转登录页面
req.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}