拦截器(Interceptor)类似于过滤器(Filter)
Spring MVC 的拦截器作用是在请求到达控制器之前或之后进行拦截,可以对请求和响应进行一些特定处理。
拦截器可以用于很多场景下:
- 登录验证:对于需要登陆才能访问的网址,使用拦截器可以判断用户是否已登录,如果未登录则跳转到登录页面。
- 权限校验:根据用户权限对部分网址进行访问控制拒绝未经授权的用户访问
- 请求日志:记录请求信息,例如请求地址、请求参数】请求时间等,用于排查问题和性能优化
- 更改响应:可以对响应的内容进行修改,例如添加头信息,调整响应内容格式等
拦截器和过滤器的区别在于他们的作用层面不同。
- 过滤器更注重在请求和响应的流程中进行处理,可以修改请求和响应的内容,例如设置编码和字符集、请求头、状态码等。
- 拦截器则更侧重于对控制器进行前置或后置处理,在请求到达控制器之前或之后进行特定的操作,例如打印日志、权限验证等
定义拦截器
实现 org.springframework.web.servlet.HandlerInterceptor接口,共有三个方法可以进行选择性的实现:
- preHandle:处理器方法调用之前执行
- 只有该方法有返回值,返回值是布尔类型,true放行,false拦截
- postHandle:处理器方法调用之后执行
- afterCompletion:渲染完成后执行
<!--配置拦截器-->
<mvc:interceptors>
<!--基本配置:第一种方式-->
<!--注意:基本配置,默认情况下是拦截所有请求的。-->
<bean class="com.powernode.springmvc.interceptors.Interceptor1"/>
<!--基本配置:第二种方式-->
<ref bean="interceptor1"/>
<!--高级配置,指定一些路径被拦截,一些路径不拦截。-->
<mvc:interceptor>
<!--拦截所有路径-->
<mvc:mapping path="/**"/>
<!-- /ok 请求路径不拦截-->
<mvc:exclude-mapping path="/ok"/>
<!--设置拦截器-->
<ref bean="interceptor1"/>
</mvc:interceptor>
<!--配置多个拦截器-->
<ref bean="interceptor1"/>
<ref bean="interceptor2"/>
<ref bean="interceptor3"/>
</mvc:interceptors>
创建拦截器类,该类需要实现HandlerInterceptor接口,需要重写三个方法:
1.preHandle:该方法在处理器方法执行之前执行。其返回值为boolean,若为true,则紧接着会执行处理器方法,且会将afterCompletion()方法放入到一个专门的方法栈中等待执行,若为false则不会执行处理器方法(请求到达Controller前执行的方法,返回值为true通过拦截器,返回值为false被拦截器拦截。)
2.postHandle:该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向/(跳转到JSP前执行的方法.)
3.afterCompletion:当preHandle()方法返回为true时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法(跳转到JSP后执行的方法。)