Filter和Interceptor

  1. Filter的使用
  • 拦截user下的所有请求
@WebFilter("/user/*")
public class UserFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpSession session = req.getSession();
        if(session.getAttribute("user") != null){
            //已登录
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            req.setAttribute("msg","此操作需要登录,请先登录");
            req.getRequestDispatcher("/index.jsp").forward(req,servletResponse);
        }
    }
    @Override
    public void destroy() {
    }
}
  1. Interceptor的使用
  • 实现HandlerInterceptor接口
public class MyFirstInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("first preHandle");
        return true;
    }
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("first postHandle");
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("first afterCompletion");
    }
}
  • 配置拦截器
<!--拦截器配置-->
<mvc:interceptors>
    <!--配置某个拦截器-->
    <bean class="com.xj.controller.MyFirstInterceptor"></bean>
    !或!
    <!--配置某个拦截器更详细的信息-->
    <!--<mvc:interceptor>-->
        <!--<mvc:mapping path="test01"/>-->
        <!--<bean class="com.xj.controller.MyFirstInterceptor"></bean>-->
    <!--</mvc:interceptor>-->
</mvc:interceptors>
  1. 1.拦截器正常流程
  • 拦截器的preHandle->目标方法->拦截器postHandle->页面->拦截器的afterCompletion;
  1. 2.拦截器其他流程
  • 只要preHandle不放行就没有以后的流程;
  • 只要放行了,afterCompletion都会执行;
  1. 3.异常流程
  • 哪一块不放行从此以后都没有;
    例如:MySecondInterceptor不放行;但是他前面已经放行了的拦截器(MyFirstInterceptor)的afterCompletion还是会执行;

总结:
拦截器的preHandle :是按照顺序执行
拦截器的postHandle :是按照逆序执行
拦截器的afterCompletion :是按照逆序执行;
已经放行了的拦截器的afterCompletion总会执行;


  1. 什么时候用Filter什么时候用拦截器?
    如果某些功能,需要其他组件配合完成,我们就使用拦截器;例如拦截前查询数据库数据,可以再拦截器中@autowired自动注入mapper查数据
    其他情况可以写filter :
posted @ 2020-09-07 16:23  微花  阅读(166)  评论(0编辑  收藏  举报

Loading