拦截器相关
顺序是:过滤器 -> 拦截器 -> 切面AOP
preHandle
请求预处理,运行业务方法前运行。可以进行安全校验,数据处理等。 HandlerMapping后和HandlerAdapter之前运行
拦截器中preHandle方法返回的为false时,则无法进入切面
postHandle
后期处理,业务方法执行完成后执行,可以对业务返回的数据进行处理。
DispatcherServlet试图处理之前运行,可以对ModelAndView进行调整。
afterCompletion
请求处理完成后返回是执行,一般用于资源清理。
在DispatcherServlet完全处理完后调用
request log
@CrossOrigin(origins="*",maxAge=3600)
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
String url = "---> " + request.getMethod() + " " + request.getRequestURI() +"?"+ request.getQueryString();
Map<String, String[]> formData = request.getParameterMap();
System.out.println(url + "\n" + JSONArray.toJSONString(formData));
//String body = new String(StreamUtils.copyToByteArray(request.getInputStream()));
return true;
}
}
response
@ControllerAdvice
public class InterceptResponse implements ResponseBodyAdvice<Object>{
public static final Logger log = Logger.getLogger(InterceptResponse.class);
@Override
public Object beforeBodyWrite(Object body, MethodParameter arg1, MediaType arg2,
Class<? extends HttpMessageConverter<?>> arg3, ServerHttpRequest request, ServerHttpResponse response) {
//
ServletServerHttpResponse respTemp = (ServletServerHttpResponse) response;
HttpServletResponse resp = respTemp.getServletResponse();
//
ServletServerHttpRequest reqTemp = (ServletServerHttpRequest) request;
HttpServletRequest req = reqTemp.getServletRequest();
// ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
// System.out.println("===> " + JSON.toJSONString(attr.getRequest()));
// System.out.println("<=== " + JSON.toJSONString(attr.getResponse()));
//
System.out.println("<--- " + JSON.toJSONString(body, SerializerFeature.UseSingleQuotes));
return body;
}
@Override
public boolean supports(MethodParameter arg0, Class<? extends HttpMessageConverter<?>> arg1) {
// TODO Auto-generated method stub
return true;
}
不使用拦截器跨域配置
在使用拦截器时不能使用WebMvcConfigurer跨域配置,拦截器是会让跨域配置失效(除非这个请求不会被拦截,像我这里的login接口),改为过滤器完美解决