1、拦截器的介绍
- 拦截器使用场景:
- 登录验证:对于需要登录才能访问的网址,使用拦截器可以判断用户是否已登录,如果未登录则跳转到登录页面。
- 权限校验:根据用户权限对部分网址进行访问控制,拒绝未经授权的用户访问。
- 请求日志:记录请求信息,例如请求地址、请求参数、请求时间等,用于排查问题和性能优化。
- 更改响应:可以对响应的内容进行修改,例如添加头信息、调整响应内容格式等。
- 拦截器和过滤器的简单区别:
- 过滤器更注重在请求和响应的流程中进行处理,可以修改请求和响应的内容,例如设置编码和字符集、请求头、状态码等。
- 拦截器则更加侧重于对控制器进行前置或后置处理,在请求到达控制器之前或之后进行特定的操作,例如打印日志、权限验证等。
2、拦截器的实现
实现拦截器需要实现HandlerInterceptor
接口,并且重写preHandle
、postHandle
和afterCompletion
,事实上即使不重写也是没问题的。该方法实际上有默认实现。其中preHandle
需要一个boolean
的返回值。如果返回值true
,程序放行。
package com.powernode.Interceptors;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class MyInterceptor1 implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyInterceptor1 preHandle 执行.......");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor1 postHandle 执行.......");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyInterceptor1 afterCompletion 执行.......");}
}
然后我们需要在SpringMVC框架的配置文件,对拦截器进行配置。有两钟方式。
方式一:
<!--配置拦截器--><mvc:interceptors><bean class="com.powernode.Interceptors.MyInterceptor1"></bean></mvc:interceptors>
方式二:
我的拦截器类名是MyInterceptor1
,在这里我们需要把首字母小写。
<mvc:interceptors><ref bean="myInterceptor1"></ref></mvc:interceptors>
测试:
3、拦截器的高级配置
设置拦截器拦截路径:
<mvc:interceptors><mvc:interceptor><!--拦截所有路径--><mvc:mapping path="/**"/><!--除 /test 路径之外--><mvc:exclude-mapping path="/test"/><!--拦截器--><ref bean="myInterceptor1"/></mvc:interceptor></mvc:interceptors>
4、多个拦截器执行顺序
Filter、Servlet、Interceptor、Controller的执行顺序:
设置多个拦截器
<mvc:interceptors><ref bean="myInterceptor2"></ref><ref bean="myInterceptor3"></ref><ref bean="myInterceptor1"></ref></mvc:interceptors>
如果所有拦截器的 preHandle
都返回true
。preHandle
按照排布顺序执行。 postHandle
和afterCompletion
按照和排布顺序相反顺序执行。
只要有一个拦截器preHandle
返回false,任何postHandle
都不执行。但返回false的拦截器的前面的拦截器按照逆序执行afterCompletion
。
现在拦截器按照顺序排布,同时让拦截器2的preHandle
返回false