Filter和Interceptor
- 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() {
}
}
- 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.拦截器正常流程
- 拦截器的preHandle->目标方法->拦截器postHandle->页面->拦截器的afterCompletion;
- 2.拦截器其他流程
- 只要preHandle不放行就没有以后的流程;
- 只要放行了,afterCompletion都会执行;
- 3.异常流程
- 哪一块不放行从此以后都没有;
例如:MySecondInterceptor不放行;但是他前面已经放行了的拦截器(MyFirstInterceptor)的afterCompletion还是会执行;
总结:
拦截器的preHandle :是按照顺序执行
拦截器的postHandle :是按照逆序执行
拦截器的afterCompletion :是按照逆序执行;
已经放行了的拦截器的afterCompletion总会执行;
- 什么时候用Filter什么时候用拦截器?
如果某些功能,需要其他组件配合完成,我们就使用拦截器;例如拦截前查询数据库数据,可以再拦截器中@autowired自动注入mapper查数据
其他情况可以写filter :
本博客文章主要供博主学习交流用,所有描述、代码无法保证准确性,如有问题可以留言共同讨论。