Interceptor
主要作用:拦截用户请求,进行处理,比如判断用户登录情况,权限验证,主要针对Action请求进行处理。是通过HandlerInterceptor 实现的。
配置如下:
<mvc:interceptors> <bean class="cn.appsys.testInterceptor"></bean>//拦截所有请求 <mvc:interceptor> <mvc:mapping path="/manager/backend/**"/> <bean class="cn.appsys.interceptor.SysInterceptor"/>//拦截上面请求 </mvc:interceptor> </mvc:interceptors>
一般拦截器可通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter实现。代码如下:
public class TestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("preHandle"); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion"); } }
preHandle是在请求到达Controller之前实现,可进行用户校验登录等操作,返回true后,请求到达Controller层;postHandle方法是在执行完Controller层代码之后,DispatcherServlet进行视图的渲染之前
执行,因此可以对ModelAndView 对象进行处理;afterCompletion方法是在DispatcherServlet进行视图的渲染之后执行调用,主要是进行一些资源清理等工作。
注:只能对Controller请求进行拦截,对一些静态资源无法拦截。
Filter
主要作用:统一设置字符集等。
依赖于servlet容器,过滤器实例只在初始化的时候调用一次。
过滤器在web.xml配置如下:
一般过滤器可通过实现Filter接口实现。代码如下:
public class TestFilter implements Filter { @Override public void destroy() { System.out.println("filter destroy"); } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("filter doFilter before"); arg2.doFilter(arg0, arg1); System.out.println("filter doFilter after"); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("filter init"); } } 拦截器和过滤器执行顺序:1、Filter.init();
2、Filter.doFilter(); before doFilter
3、HandlerInterceptor.preHandle();
4、Controller方法执行
5、HandlerInterceptor.postHandle();
6、DispatcherServlet视图渲染
7、HandlerInterceptor.afterCompletion();
8、Filter.doFilter(); after doFilter
9、Filter.destroy();
Filter和Interceptor的区别
- Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
原文地址:https://www.cnblogs.com/xfwbing/p/9400338.html
时间: 2024-10-04 02:32:17