Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
用户请求----->拦截器----->Controller,在拦截器处就可以做一些前处理和后处理
1 如何实现
实现HandlerInterceptor接口
package study.wyy.spring.anno.intercerptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author by wyaoyao
* @Description
* @Date 2021/2/15 7:33 下午
*/
public class HandlerInterceptor1 implements HandlerInterceptor {
/****
* Controller执行前调用此方法
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("HandlerInterceptor1....preHandle");
return true;
}
/**
* controller执行后但未返回视图前调用此方法
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("HandlerInterceptor1....postHandle");
}
/****
* controller执行后且视图返回后调用此方法
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("HandlerInterceptor1....afterCompletion");
}
}
- 配置
之前xml是这么配置的:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 所有的请求都进入拦截器 可以配置其他路径,这个配置就是你要拦截的请求url-->
<mvc:mapping path="/**" />
<!-- 配置具体的拦截器 -->
<bean class="cn.wyy.ssm.interceptor.HandlerInterceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<!-- 所有的请求都进入拦截器 -->
<mvc:mapping path="/**" />
<!-- 配置具体的拦截器 -->
<bean class="cn.wyy.interceptor.HandlerInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
注解开发,重写WebMvcConfigurer的addInterceptors方法
@Autowired
HandlerInterceptor1 handlerInterceptor1;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(handlerInterceptor1);
}
2 执行顺序
- preHandle按拦截器定义顺序调用
- postHandler按拦截器定义逆序调用
- afterCompletion按拦截器定义逆序调用
- postHandler在拦截器链内所有拦截器返成功调用
- afterCompletion只有preHandle返回true才调用