Spring学习笔记-第十天:Spring拦截器
六、SpringMVC拦截器
1.拦截器(interceptor)的作用
SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理
将拦截器按一定的顺序连接成一条链,这条链叫做拦截器链(Interceptor Chain),在访问被拦截的方法或字段时,拦截器链中的的拦截器会按之前定义的顺序被调用,拦截器也是AOP思想的具体实现。
2.拦截器与过滤器的区别
servlet三大组件:servlet Listener filter
| 区别 | 过滤器 | 拦截器 |
|---|---|---|
| 使用范围 | 是servlet规范中的一部分,任何JavaWeb都可以使用 | 是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用 |
| 拦截范围 | 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截 | 只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或是js是不会进行拦截的 |
3.拦截器快速入门
- 创建拦截器实现HandlerInterceptor接口
//在目标方法执行之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
return false;
}
//在目标方法执行之后 视图返回之前执行
@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...");
}
- 配置拦截器-spring-mvc.xml
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 代表对那些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<bean class="com.itheima.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
- 测试拦截器的拦截效果
这时发现,没有显示出页面,控制台只打印了preHandle,这是因为preHandle函数默认返回false,表示方法被拦截
测试preHandle的拦截效果和postHandle的修改M&V效果
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
//获取请求携带参数,括号内参数表示url输入时的变量参数
String param = request.getParameter("param");
//若写 param.equals()则不输入param时则报错,可能当读取不到时,param当主体调用参数会出错
if("yes".equals(param)){
return true;
}
else {
//转发一下
request.getRequestDispatcher("/error.jsp").forward(request,response);
return false;
}
}
//在目标方法执行之后 视图返回之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.addObject("name","haijian");
System.out.println("postHandle...");
}
测试拦截器链的效果
preHandle...
pre222
目标资源执行......
post222
postHandle...
afterCompletion...
4.拦截器方法说明
| 方法名 | 说明 |
|---|---|
| preHandle() | 方法在请求处理之前调用,有bool类型返回值决定是否拦截,若为true,继续调用下一个preHandle方法 |
| postHandle() | 在当前请求处理后被调用,前提是true,且它会在DispatcherServlet进行视图返回渲染之前呗调用,所有可以在Controller处理之后的M&V对象进行操作 |
| afterCompletion() | 在DispatcherServlet渲染了对应的视图之后执行 |
5.知识要点
自定义拦截器步骤
- 创建拦截器类实现HandlerInterceptor接口
- 配置拦截器
- 测试拦截器拦截效果

浙公网安备 33010602011771号