IE在POST中忽略303重定向 - >重定向 - > GET场景

时间:2015-02-14 07:21:21

标签: internet-explorer redirect http-post post-redirect-get

我有一个启用OAuth2的网站,该网站遇到与IE如何处理303响应相关的问题。在流程中,发生3次重定向。

### Chrome/Firefox
POST idp.com/login           (res 302 -> idp.com/authenticate)
GET  idp.com/authenticate    (res 302 -> app.com/oauth2/callback)
GET  app.com/oauth2/callback (res 303 -> app.com/home)
GET  app.com/home

### IE
POST idp.com/login           (res 302 -> idp.com/authenticate)
POST idp.com/authenticate    (res 302 -> app.com/oauth2/callback)
POST app.com/oauth2/callback (res 303 -> app.com/home)
POST app.com/home
由于某种原因,IE似乎维护了原始的请求方法。我尝试通过返回303来至少从我的服务器(app.com)上的原始POST响应中断,但这也没有解决问题。这是意料之外的,因为RFC 2068声明对于303 - See Other响应,应遵循以下内容

  

可以在a下找到对请求的响应   不同的URI,应该使用GET方法检索   资源。该方法主要用于允许输出a   POST激活的脚本,用于将用户代理重定向到选定的用户代理   资源。

我甚至尝试了307响应但没有成功。有没有人对这里发生的事情有任何想法?

2 个答案:

答案 0 :(得分:0)

在遇到与LinkedIn OAuth和我的应用程序类似的问题时,我以一种特别不雅的方式解决了这个问题。我允许POST方法用于我的回调地址,然后在我的servlet实现内部处理它,就像它是一个GET调用一样。

    @RequestMapping(value = ApiValues.LINKEDIN_CALLBACK, method = RequestMethod.POST)
public void doPost(HttpServletRequest request, HttpServletResponse response,
        @RequestParam(value = "oauth_token", required = false) String tokenString,
        @RequestParam(value = "oauth_verifier", required = false) String verifierString) throws ServletException, IOException {

    handleCallBack(request, response, tokenString, verifierString);
}


@RequestMapping(value = ApiValues.LINKEDIN_CALLBACK, method = RequestMethod.GET)
public void doGet(HttpServletRequest request, HttpServletResponse response,
        @RequestParam(value = "oauth_token", required = false) String tokenString,
        @RequestParam(value = "oauth_verifier", required = false) String verifierString) throws ServletException, IOException {

    handleCallBack(request, response, tokenString, verifierString);
}

注意到IE(以及旧版本的IE)似乎只提供此问题,Chrome,Firefox和Safari似乎都按照规范重定向到GET。

答案 1 :(得分:0)

如果您正在使用IE调试器工具,请不要相信它。网络面板会将303和302的先前请求(POST)与当前请求(GET)组合在一起。因此,您将在网络面板中看到POST,但事实仅是GET请求。尝试使用Charles或其他HTTP监视工具检查请求。