写在前面:最近在对一个微服务增减接口拦截器的时候,定义的拦截器未能生效,并且未报任何异常,swagger的ui也无法正常访问。经查明原因:prehandler方法最后返回的布尔值是false,拦截器定义部分是从其他服务拷贝的文件,由于没有检查,导致未能生效。
- 配置拦截器
我这里配置拦截器没有使用 xml,使用的是java的方式配置的interceptor,这样比较直观,更容易理解。
InterceptorConfig这个类继承WebMvcConfigurerAdapter 抽象类,WebMvcConfigurerAdapter 抽象类 实现了 WebMvcConfigurer 接口。WebMvcConfigurer 该接口可以对拦截器的很多属性进行配置。
package com.example.swaggertest.demos.web.Config;import com.example.swaggertest.demos.web.Interceptor.CollrollerInterceptorHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//覆写拦截器过滤条件registry.addInterceptor(new CollrollerInterceptorHandler()).addPathPatterns("/**"); //对所有的接口进行过滤}}
- 定义拦截器
CollrollerInterceptorHandler 实现了HandlerInterceptor 接口,这个接口里定义了三个方法,如代码所示。
package com.example.swaggertest.demos.web.Interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class CollrollerInterceptorHandler implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//编写拦截业务return true; //注意一定要返回true,否则容易出现与swagger集成问题,导致不能访问swagger的ui}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}
- 拦截器与过滤器的区别
拦截器与过滤器的区别