Spring Boot 添加拦截器
介绍一下在Spring Boot 2.0.0以上版本如何添加拦截器
方法1
新增拦截器
新增拦截器,并打印请求URI。
@Component
public class SecurityInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(SecurityInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI();
logger.info("url : " + url);
return true;
}
}
配置拦截器
Spring Boot 2.0+以上WebMvcConfigurerAdapter 过时,我们采用WebMvcConfigurer替代
,配置后让拦截器生效。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(SecurityInterceptor.class);
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 配置拦截器
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/**");
}
}
方法2
新增拦截器
@Slf4j
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("输出URI:"+request.getRequestURI());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
}
配置拦截器
@Configuration
public class AbcConfgiurer extends WebMvcConfigurationSupport {
/** 解决跨域问题 **/
@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOrigins("*")
// 是否允许证书
.allowCredentials(true)
// 设置允许的方法
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
super.addCorsMappings(registry);
}
/** 添加拦截器 **/
@Override
protected void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new MyInterceptor());
// 拦截器2
// 拦截器3
// 拦截器4
super.addInterceptors(registry);
}
}
拦截所有响应
@Slf4j
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
String requestPath = request.getURI().getPath();
System.out.println("requestPath:" + requestPath);
System.out.println(body);
if(requestPath.equals("/targetMenu")) {
// 判断响应值是什么类型
if(body instanceof ArrayList) {
List<String> resultStringList = (List<String>) body;
for(String s : resultStringList) {
System.out.println(s;
}
// 拿到这次请求的参数
Object myParam = ((ServletServerHttpRequest) request).getServletRequest().getAttribute("requestParam");
log.info("parameter:{}", myParam);
}
}
return body;
}
}