为重定向URL添加CORS请求头后仍遭拦截,请求排查解决
问题原因与解决方案
问题本质
你当前的代码逻辑完全搞错了CORS头的作用对象:
response.sendRedirect(url)是让浏览器发起新的请求到目标url,你设置的Access-Control-Allow-Origin是加在重定向的302响应里,而不是目标url的响应里。- 浏览器的CORS检查针对的是最终要访问的目标资源,也就是新请求的
url返回的响应,所以你当前的头配置根本起不到作用,预检请求自然会失败。
解决方案
情况1:目标URL是你可控的服务
直接在目标URL对应的服务中配置CORS,添加Access-Control-Allow-Origin等必要头,比如允许你的前端域名访问。
情况2:目标URL不可控(第三方服务)
用后端代理的方式绕开跨域:让你的后端去请求目标URL,再把结果返回给前端,这样前端和你的后端是同域,不会触发CORS限制。示例代码如下:
public void proxyTargetUrl(HttpServletResponse response, HttpServletRequest request) throws Exception { // 获取目标URL String targetUrl = getWeb(some param); // 后端发起请求到目标服务 URL url = new URL(targetUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 可选:复制前端请求的头信息(比如Cookie、User-Agent等) Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); conn.setRequestProperty(headerName, request.getHeader(headerName)); } // 设置允许前端跨域访问当前后端接口 response.setHeader("Access-Control-Allow-Origin", "*"); // 同步目标服务的响应类型 response.setContentType(conn.getContentType()); // 将目标服务的响应内容转发给前端 try (InputStream input = conn.getInputStream(); OutputStream output = response.getOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = input.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } } finally { conn.disconnect(); } }
额外说明
不要试图通过在重定向响应中加CORS头解决问题,这是对CORS机制的误解。跨域限制的核心是浏览器对最终目标资源的响应检查,只有目标资源返回符合要求的CORS头,或者通过同域代理中转,才能解决问题。
内容的提问来源于stack exchange,提问作者ZZZ
相关产品推荐
相关产品推荐

