SpringMVC-Interceptor
拦截器的作用
- SpringMVC的拦截器类似于Servlet开发中过滤器Filter,用于对处理器进行预处理和后处理
- 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
拦截器和过滤器的区别
区别 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
使用范围 | 是servlet规范中的一部分,任何Java Web工程都可以使用 | 是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用 |
拦截范围 | 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截 | 在<mvc:mapping path=“”/>中配置了/**之后,也可以多所有资源文件进行拦截,但是可以通过<mvc:exclude-mapping path=“”/>标签排除不需要拦截的资源 |
拦截器的快速入门
-
创建拦截器类实现HandlerInterceptor接口
-
public class MyInterceptor1 implements HandlerInterceptor { /**在目标方法执行之前执行*/ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."); return true; } /**目标方法执行之后视图返回之前执行*/ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle..."); } /**在整个流程都执行完毕后 执行*/ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion..."); } }
-
-
配置拦截器
-
<!--配置拦截器--> <mvc:interceptors> <mvc:interceptor> <!--对那些资源执行拦截操作--> <mvc:mapping path="/**"/> <bean class="com.ytzl.interceptor.MyInterceptor1"/> </mvc:interceptor> </mvc:interceptors>
-
-
测试拦截器的拦截效果
-
@RequestMapping("/show") public ModelAndView show(){ System.out.println("目标资源执行"); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("name","玫瑰无原则"); modelAndView.setViewName("index"); return modelAndView; }
-
<h1>你是我值得一生去观望的烟火,可惜最后只能在记忆中临摹。---${name}</h1>
-
详解
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--对那些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<bean class="com.ytzl.interceptor.MyInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<!--对那些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<bean class="com.ytzl.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
像此多个拦截器会依次从上往下执行
/**在目标方法执行之前执行*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
String name = request.getParameter("name");
if (name.equals("我想你了")){
return true;
}else {
request.getRequestDispatcher("/error.jsp").forward(request,response);
return false;//返回true代表放行,false不放行
}
}
/**目标方法执行之后视图返回之前执行*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.addObject("name","是小星星呀....");
System.out.println("postHandle...");
}
在拦截之后进行判断,放行后进行修改视图属性值
知识小结
拦截器方法说明
方法名 | 说明 |
---|---|
preHandle() | 方法将在请求处理之前调用,返回值boolean,返回true即放行,反之拦截并要设置转发页面 |
postHadnle() | 方法将在请求处理之后被调用,前提是preHandle()放行后才能被调用,且会在DispatcherServlet进行视图返回值渲染之前被调用 |
,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作 | |
afterCompletion() | 该方法将在整个请求结束之后,也就是DispatcherServlet渲染了对应的视图之后执行,前提是preHandle放行后才能被调用 |
自定义拦截器步骤
- 创建拦截器类实现HandlerInterceptor接口
- 配置拦截器
- 测试拦截器的拦截效果