Spring拦截器HandlerInterceptor和HandlerInterceptorAdapter
https://www.cnblogs.com/june0816/p/14355853.html
一、HandlerInterceptor
1. 接口,定义了三个方法
2. 可以自定义拦截器类,直接实现该接口进行拦截

public interface HandlerInterceptor {
// 预处理,在业务处理之前被调用,返回true继续执行,返回false中断执行
boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;
// 在业务处理之后,视图生成之前被调用
void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;
// 在视图生成之后被调用
void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}

二、HandlerInterceptorAdapter是抽象类,间接实现了HandlerInterceptor接口
1. HandlerInterceptorAdapter--->AsyncHandlerInterceptor--->HandlerInterceptor
2. 可以自定义拦截器类,继承HandlerInterceptorAdapter抽象类进行拦截
3. 适配器模式,不必全部实现HandlerInterceptor的三个方法,只需要根据业务需求,实现特定的方法
三、如何使用
1. 创建一个拦截器类,继承HandlerInterceptorAdapter抽象类
2. 重写preHandle()方法,通过HttpServletRequest获取参数、URI、Cookie、Session等进行业务处理

@Slf4j
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ip = request.getParameter("ip");
return true;
}
}

3. 配置拦截器
a. spring mvc配置到xml里

<!--登录拦截验证-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.a.b.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

b. spring boot
新建一个类,实现WebMvcConfigurer接口
重写addInterceptors()方法
把刚才新建的拦截器实例,添加进拦截器列表里

@Configuration
@Slf4j
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor).addPathPatterns("/**");
}
}

四、运行流程
1. 拦截器是一个列表,按顺序执行拦截器的preHandle()方法
2. 如果preHandle()方法返回false,不再往下执行
3. 执行主方法,即controller里的接口
4. 逆序执行postHandle()方法
5. view页面渲染
6. 逆序执行afterCompletion()方法
本文详细介绍了Spring MVC框架中的拦截器机制,包括HandlerInterceptor接口及其方法的作用,HandlerInterceptorAdapter的使用方式,以及如何自定义拦截器并配置到项目中。最后,通过实例演示了拦截器的运行流程。
6664

被折叠的 条评论
为什么被折叠?



