SpringBoot 拦截器的使用

拦截器相关

顺序是:过滤器 -> 拦截器 -> 切面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接口),改为过滤器完美解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值