请求处理流程
拦截器简介
- 拦截器(Interceptor)是一种动态拦截方法调用的机制
- 作用
- 在指定的方法调用前后执行预先设定的代码
- 阻止原始方法的执行
- 核心原理:AOP思想
拦截器链
多个拦截器按照一定的顺序,对原始方法的功能进行增强。
拦截器VS过滤器
-
归属不同
Filter属于Servlet的技术,Interceptor属于SpringMVC的技术。
-
拦截内容不同
Filter对所有访问进行拦截,Interceptor只针对SpringMVC的访问请求进行拦截。
拦截器的作用
使用AOP的思想,对原始方法功能增强。
拦截器的配置流程
-
创建拦截器处理类,实现
HandlerInterceptor
处理程序拦截器接口,覆写其默认方法。/** * 拦截器处理类 */ public class MyInterceptor implements HandlerInterceptor { /** * 前置处理方法,在原始方法执行之前执行 * * @param request 请求对象 * @param response 响应对象 * @param handler -> public void com.itheima.controller.ResponseDemo.demo14() 原始方法对象,实际上是一个Method数据类型的对象 * @return 如果前置方法返回为false,表示不再往后执行,原始方法也会被拦截,不会执行;如果返回true则继续往后执行 * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return false; } /** * 后置处理方法,在原始方法执行之后执行 * * @param request * @param response * @param handler 原始方法对象 * @param modelAndView 模型视图对象,用于返回给核心控制器,分配给视图解析器解析后,展示给用户 * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } /** * 完成处理方法,该方法最后执行,在后置方法之后执行 * * @param request * @param response * @param handler 原始对象方法 * @param ex 异常对象,用于获取原始方法执行的异常信息 * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
要注意的是前置方法的返回值,如果返回false则终止方法的执行,原始方法及后置方法、完成方法都不会执行。
返回true,就继续往后依次执行。
-
在配置文件中配置拦截器
spring-mvc.xml
<!--配置拦截器--> <mvc:interceptors> <!--可以配置多个拦截器--> <mvc:interceptor> <!--配置要拦截的请求地址--> <mvc:mapping path="/demo14"/> <!--配置拦截器处理类,就是我们编写第一步编写的类--> <bean class="com.itheima.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
- mapping标签:可以配置多个,支持通配符
*
*
:表示任意名称,/*
仅表示根路径下任意名称,不再往下匹配目录**
:表示当前路径及其子路径,/**
表示根路径及其子路径下的任意名称
- exclude-mapping标签:用于排除不需要拦截的请求地址,支持通配符
*
- bean标签及ref标签:在一个
<mvc:interceptor>
标签中,只能配置一个,用于配置拦截器处理类。
- mapping标签:可以配置多个,支持通配符
拦截器使用实例
-
原始方法
@RequestMapping("/demo14") public void demo14() { System.out.println("原始方法执行"); }
-
拦截器处理类
/** * 拦截器处理类 */ public class MyInterceptor implements HandlerInterceptor { /** * 前置方法,在原始方法执行之前执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("前置处理"); return true; } /** * 后置方法,在原始方法执行之后执行 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("后置处理方法"); } /** * 完成后方法,该方法最后执行,在后置方法之后执行 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("完成处理方法"); } }
-
配置拦截器
spring-mvc.xml
<!--配置拦截器--> <mvc:interceptors> <!--可以配置多个拦截器--> <mvc:interceptor> <!--配置要拦截的请求地址--> <mvc:mapping path="/demo14"/> <!--配置拦截器处理类,就是我们编写第一步编写的类--> <bean class="com.itheima.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
-
测试结果
请求url:
http://localhost:80/demo14
结果: