Jersey后端返回303状态码,前端XMLHttpRequest收到200的问题
解决方案
核心原因
浏览器的XMLHttpRequest会自动跟随所有3xx系列重定向,你看到的200状态码是重定向目标页面的响应,而非服务器返回的原始303响应。因此前端无法获取原始响应的Location头和Cookie——XHR已经自动完成跳转,当前处理的是跳转后的页面响应。
具体修复步骤
1. 禁用XHR自动重定向
在调用xhr.open()之后添加以下代码,阻止浏览器自动跳转,这样就能拿到原始的303响应:
xhr.followRedirects = false;
注:现代主流浏览器均支持该属性,若遇到兼容性问题,可额外添加请求头标识AJAX请求:
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
2. 调整后端逻辑(推荐方案)
AJAX请求本身不需要浏览器自动跳转,更合理的做法是后端返回200状态码,将跳转地址和Token通过响应头或响应体传递给前端,由前端手动执行跳转:
- 修改后端代码:
return Response .status(Response.Status.OK) .entity(token) .header("Redirect-Url", redirect) .cookie(cookie) .build();
- 对应修改前端代码:
if(xhr.status === 200) { console.log("Login success"); const redirectUrl = xhr.getResponseHeader("Redirect-Url"); if(redirectUrl) { window.location.href = redirectUrl; } }
3. 检查Cookie路径配置
你设置的Cookie路径为/app/,如果前端页面不在/app/路径下,浏览器会限制前端获取该Cookie。可以将路径调整为根路径/,确保所有页面都能访问:
NewCookie cookie = new NewCookie("Token",token,"/", request.getServerName(),"User token",1800,false);
4. 排查代理/服务器配置干扰
检查Tomcat的server.xml或反向代理(如Nginx)的配置,确认是否存在自动修改3xx响应的规则,部分服务器会默认调整重定向行为导致异常。
内容的提问来源于stack exchange,提问作者Dewa Syahrizal MN
相关产品推荐
相关产品推荐

