【问题标题】:response.sendRedirect() gives HTTP ERROR: 400 BAD_REQUEST only in IEresponse.sendRedirect() 给出 HTTP ERROR: 400 BAD_REQUEST only in IE
【发布时间】:2011-12-12 23:40:32
【问题描述】:

我正在使用带有 Google 帐户的 Google App Engine (Java) 进行身份验证。

我创建了一个 servlet (processSignIn.jsp),它确保该帐户应该被允许进入,而不是有效的 Google 帐户(邀请批准等)。如果代码计算正确,它会发出“response.sendRedirect(url)”以将用户发送到“url”参数指定的 URL。

如果用户点击此类链接:

<a href="<%= userService.createLoginURL("../processSignIn.jsp?url=" +
request.getRequestURI()) %>">Sign in with a Google Account</a>

然后使用他们的 Google 帐户登录,在 Firefox 或 Chrome 上一切正常,但在 IE 9 上不行。请参阅下面的请求和响应。

注意两个 GET 标头之间的区别... FF 不包含“../”,但 IE 包含。我想继续使用相对路径,这样我就不必为本地开发测试做任何奇怪的事情了。

可能是什么问题?

火狐请求:

GET http://www.[mydomain].com/processSignIn.jsp?url=/main.jsp HTTP/1.1
Host: www.[mydomain].com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: [my cookie data]

火狐响应:

HTTP/1.1 302 Found
Content-Type: text/html
Location: http://www.[mydomain].com/main.jsp
X-AppEngine-Estimated-CPM-US-Dollars: $0.000138
X-AppEngine-Resource-Usage: ms=18 cpu_ms=0 api_cpu_ms=0
Date: Sun, 11 Dec 2011 02:58:06 GMT
Server: Google Frontend
Content-Length: 0

IE 9 请求:

GET http://www.[mydomain].com/../processSignIn.jsp?url=/main.jsp HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Pragma: no-cache
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Cookie: [my cookie data]
Accept-Encoding: gzip, deflate
Host: www.[mydomain].com
Connection: Keep-Alive
Cache-Control: no-cache

IE 9 响应:

HTTP/1.1 400 Bad Request
Cache-Control: must-revalidate,no-cache,no-store
Content-Type: text/html; charset=iso-8859-1
X-AppEngine-Estimated-CPM-US-Dollars: $0.001025
X-AppEngine-Resource-Usage: ms=13 cpu_ms=32 api_cpu_ms=0
Vary: Accept-Encoding
Date: Sun, 11 Dec 2011 03:00:23 GMT
Server: Google Frontend
Content-Length: 1292

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 400 BAD_REQUEST</title>
</head>
<body>
<h2>HTTP ERROR: 400</h2>
<p>Problem accessing /../processSignIn.jsp. Reason:
<pre>    BAD_REQUEST</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>

【问题讨论】:

    标签: java google-app-engine servlets


    【解决方案1】:

    这只能意味着生成的&lt;a&gt; 元素有一个带有/../ 的URL,这使得MSIE 和Jetty 窒息。请注意,您的 JSP/servlet 代码甚至没有被命中。由于 URI 错误,是 Jetty 立即阻止了请求。

    要解决错误的 URI,请不要将上下文相关的 URL 与 ../ 一起使用,而应使用域相关的 URL。在你的情况下,那将是

    <a href="<%= userService.createLoginURL(request.getContextPath() 
        + "/processSignIn.jsp?url=" + request.getRequestURI()) %>">
    

    顺便说一句,我想知道userService.createLoginURL() 应该做什么。它似乎并没有什么特别之处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多