Interceptor(拦截器)
拦截器是AOP实现的。
实现拦截器步骤:1、定义 2、注册
HandlerInterceptorAdapter与WebMvcConfigurerAdapter更方便些,不需要实现所有方法。
HandlerInterceptor与WebMvcConfigurer则需要实现所有方法
定义一个拦截器
public class TokenInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandler");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandler");
}
}
注册拦截器
@Configuration
public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/user/*").excludePathPatterns("/user/getone2");
}
}
这样就添加了一个拦截器。 拦截除/user/getone2以外的与/user/*匹配的域名,比如会拦截/user/getone1、/user/getone3。
(注:/user/test/test不拦截,/user/test/test匹配/user/*/*而不匹配/user/*)
应用:
1、用户是否存在。具体比如验证token在数据库中是否存在:不存在,表明用户不存在或登陆过期等,拒绝通过;存在,通过。
2、整个系统字符集编码
3、URL访问权限过滤
4、过滤敏感词信息
5、日志记录
6、等等
拦截器是AOP的一种实现,所以有多个拦截器顺序与AOP顺序是一样的。
AOP详见:https://blog.youkuaiyun.com/sunshine_YG/article/details/82705170
个人测试了三个拦截器,结果如下:
拦截器顺序测试代码:
public class Interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("=pre==="+this.getClass().getSimpleName());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("=post==="+this.getClass().getSimpleName());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("=after==="+this.getClass().getSimpleName());
}
}
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}
@Override
public void addFormatters(FormatterRegistry registry) {
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// InterceptorRegistration registration = registry.addInterceptor(new TokenInterceptor());
// registration.addPathPatterns("/*");
InterceptorRegistration interceptor = registry.addInterceptor(new Interceptor1());
interceptor.addPathPatterns("/*");
InterceptorRegistration interceptor2 = registry.addInterceptor(new Interceptor2());
interceptor2.addPathPatterns("/*");
InterceptorRegistration interceptor3 = registry.addInterceptor(new Interceptor3());
interceptor3.addPathPatterns("/*");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
@Override
public void addCorsMappings(CorsRegistry registry) {
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
}
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
}
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
}
@Override
public Validator getValidator() {
return null;
}
@Override
public MessageCodesResolver getMessageCodesResolver() {
return null;
}
}