response.sendRedirect () выдает ОШИБКУ HTTP: 400 BAD_REQUEST только в IE - PullRequest
1 голос
/ 13 декабря 2011

Я использую Google App Engine (Java) с учетными записями Google для аутентификации.

Я создал сервлет (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 содержит.Я хотел бы продолжить использовать относительные пути, чтобы мне не нужно было делать ничего странного для локального тестирования разработчиков.

В чем может быть проблема?

Запрос Firefox:

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]

Ответ Firefox:

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:

<code>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
Работает на причале: //

1 Ответ

0 голосов
/ 13 декабря 2011

Это может означать только то, что сгенерированный элемент <a> имеет URL с /../ внутри, что заставило MSIE и Jetty задушить.Обратите внимание, что ваш код JSP / сервлета даже не был обработан.Именно Jetty немедленно заблокировал запрос из-за неверного URI.

Чтобы устранить неправильный URI, просто не используйте контекстные URL-адреса с ../, а используйте доменные URL-адреса.В вашем случае это будет

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

Кстати, мне интересно, что должен делать userService.createLoginURL().Кажется, он ничего особенного не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...