Spring 拦截器 interceptor
Spring MVC
一、两种方式来定义:
1.通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。
二、xml配置
<!-- 配置拦截器 --> //自定义 MyInterceptor要实现拦截器的接口
<bean id="customInterceptor" class="com.example.MyInterceptor" />
<!-- 配置拦截器映射 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置需要拦截的路径 -->
<mvc:mapping path="/**" />
<!-- 配置不需要拦截的路径 -->
<mvc:exclude-mapping path="/login" />
<mvc:exclude-mapping path="/error" />
<!-- 引用拦截器bean -->
<bean ref="customInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
........
</mvc:interceptor>
</mvc:interceptors>
三、处理过程
1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。
2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。
3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
四、多拦截器处理过程
preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterComplention1
五、支持
拦截器是spring容器的,是spring支持的
六、java实现拦截
步骤一:自定义MyInterceptor类实现HandlerInterceptor接口
@Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor:Pre Handle method is Calling"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor:Post Handle method is Calling"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception { System.out.println("MyInterceptor:Request and Response is completed"); } }
步骤二:注册拦截器(和XML方式的区别)
自定义MyInterceptorConfig类实现WebMvcConfigurer接口(springboot2.0以下版本使用WebMvcConfigurerAdapter)
@Component
public class MyInterceptorConfig implements WebMvcConfigurer {
@Autowired
MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 可以写多个 registry.addInterceptor,也可写多个addPathPatterns
registry.addInterceptor(myInterceptor).addPathPatterns("/a/ab")
.addPathPatterns("/a/cd");
// .addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/login", "/error"); // 排除登录和错误处理请求
}
}
HandlerInterceptor和WebRequestInterceptor的关系和区别
关系
功能相似性:两者都可用于在Controller层请求处理前后进行拦截,执行一些特定的逻辑。例如,两者都提供了preHandle、postHandle和afterCompletion方法,这些方法在请求处理的不同阶段被调用。
间接联系:WebRequestInterceptor间接实现了HandlerInterceptor的功能,这通过WebRequestHandlerInterceptorAdapter适配器类来实现。这意味着,WebRequestInterceptor可以被适配为HandlerInterceptor的形式,在Spring MVC框架中使用。
区别
1.参数类型:
HandlerInterceptor:其方法参数使用原生的HttpServletRequest和HttpServletResponse对象。
WebRequestInterceptor:其方法参数使用WebRequest对象,该对象是对HttpServletRequest和HttpServletResponse的包装,使得获取请求中的信息更为简便。
2.返回值:
HandlerInterceptor的preHandle方法返回一个布尔值,用于决定是否继续执行后续的Interceptor和Controller。如果返回false,则后续的Interceptor和Controller都不会被执行。
WebRequestInterceptor的preHandle方法没有返回值,意味着该方法中的逻辑不影响后续方法的执行。这表示WebRequestInterceptor主要是为了获取请求中的信息或预设一些参数供后续流程使用。
3.功能侧重:
HandlerInterceptor:功能更为强大和基础,可以在请求处理前、后以及视图渲染后执行各种逻辑,如权限验证、日志记录、异常处理等。
WebRequestInterceptor:主要侧重于请求验证的目的,它接收请求并对其进行处理,但不会像HandlerInterceptor那样强制拦截不合法的请求。
4.使用场景:
HandlerInterceptor:更适用于需要严格控制请求流程、执行复杂逻辑的场景,如权限验证、请求参数校验等。
WebRequestInterceptor:适用于需要简化请求信息处理、提取公共请求参数等场景。