0 前言
Interceptor作为springmvc的一个组件,可以在调用handler之前和之后处理其他事情。不同于Filter的是,Interceptor能够感知handler。但是该组件有一个坑你可能没有注意过,那就是Interceptor的postHandle不能修改@ResponseBody和ResponseEntity方法的响应。我们先介绍Interceptor组件和配置方法,最后再来解释这个坑。
1 Interceptor
- preHandle(..) — 在相应的handler执行之前调用;如果return false,则不会再执行postHandler,甚至连handler也不会执行
- postHandle(..) — 在相应的handler执行之后调用
- afterCompletion(..) — 在请求完成之后调用
2 Interceptor配置(笔者使用springboot)
Controller
@Controller
public class InterceptorController {
@GetMapping("index")
public String hello() {
System.out.println("handler...");
return "hello";
}
}
Interceptor
public class HelloInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
httpServletResponse.setHeader("username", "Json");