问题:
后端sendRedirect方法使用redirect方式进行url重定向,http返回码默认是302,部分前端会将该返回码会强制将原本post请求转换成get请求,导致post参数丢失。
原因:
302 Found:当服务器返回状态码 302 时,表示请求的资源暂时被重定向到其他位置。对于 GET 请求,客户端会自动进行重定向操作,而对于POST 请求,则可能会将请求方法改为 GET 并重定向。
307 Temporary Redirect:与 302 不同,当服务器返回状态码 307 时,表示请求的资源也被临时重定向到了其他位置。不同的是,对于所有类型的请求(包括 GET、POST 等),客户端都会保持原始请求的方法和消息体不变,并重发请求到新的 URI。
因此,307 Temporary Redirect 更适合于需要保持原始请求特性的场景,尤其是对于 POST 请求的处理。
解决:
使用HttpServletResponse的setStatus方法设置为307不起作用,sendRedirect 方法会将setStatus中的状态码覆盖,总会返回302,所以不能进使用sendRedirect需要手动设置HTTP头Location字段。
代码:
String redirectUrl = redirectDomain+"/doProcess";
//response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); //无效,会被sendRedirect的302覆盖
//response.sendRedirect(redirectUrl);//HttpServletResponse方式
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);//默认状态码302,苹果手机App会将post会变成get,所以改成307
response.setHeader("Location", redirectUrl);