一、 前言
- 在写分布式压测平台前端部分定义了一个接口:/api/pressure/addPressssureConfig ,由于该接口的特殊性,我的前端部分采用axios框架,自己设置了请求头
- 当我开始前后端联调的时候框架发出了OPSTIONS请求,而非我预期的正常POST请求,而OPSTIONS请求是不会携带Cookie的,所以OPSTIONS请求在后端拦截器处理必然失败,导致浏览器报跨域问题
二、解决方案
分析
- 后面查了相关文章,axios框架如果自己设置请求头,框架会先发出OPSTIONS请求,若请求失败,后续请求不会发出,若正常会发出真正自己定义的请求
- OPSTIONS请求不会携带Cookie,所以后端拦截器会处理失败
可以理解OPSTIONS请求为试探性请求
解决
- 后端拦截器,对OPSTIONS请求进行处理
public class IdentityInterceptor extends HandlerInterceptorAdapter {
private static final String METHOD = "OPTIONS";
//进入controller层之前进行拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//对于OPSTIONS请求放行,可自行额外添加校验条件
if (METHOD.equals(request.getMethod())){
return true;
}
.....
}
//controller层处理完之后拦截
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
......
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
......
}
}