处理过程
=> 对比本地与docker内前端差异下,网络请求的处理不同
本地情况下,所有的后端路由IDE自带的服务器进行了代理,于是不存在跨域问题;
docker内,后端路由直接经过nginx进入到后端服务器,而后端的url与前端url不同,所有存在跨域
=> 确认CORS的filter
CORS跨域会对非基本的url发送一个OPTION请求,询问后端是否允许,然后再发送请求。我们的处理是增加了CORSFilter,确认允许返回。
看代码确实设置了Credentials、Origin、Methods、Headers进行了规定,这也是为什么其他的路由都正常的原因
=> 通过tcpdump抓波查看该路由与其他路由的差异
发现在该路由下,存在一个新的header
=> 重新设置了一下Header,问题解决
处理结果
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
String strOrigin = ((HttpServletRequest) request).getHeader("origin");
String strHeader = ((HttpServletRequest) request).getHeader("Access-Control-Request-Headers");
String strMethod = ((HttpServletRequest) request).getMethod();
String strUrl = ((HttpServletRequest) request).getRequestURL().toString();
log.info("---{}-{}-{}-{}---",strMethod, strUrl, strOrigin, strHeader);
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("Access-Control-Allow-Origin", strOrigin);
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
res.setHeader("Access-Control-Allow-Headers", strHeader);
if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
response.getWriter().println("ok");
return;
}
chain.doFilter(request, response);
}