2009-08-04 3 views
5

Я пытаюсь вернуть код ошибки 401 из webapp, чтобы инициировать базовый процесс аутентификации, но tomcat захватывает ответ, чтобы отобразить его страницу отчета о состоянии. Есть ли способ предотвратить использование tomcat и оставить код ошибки в браузере?Избегание отчета о статусе tomcat

UPDATE Моя ошибка: я забыл WWW-Authenticate заголовок

+1

кот будет ничего не угон, если это возвращение страницу отчета о статусе по умолчанию, тогда вы просто не настроили ее правильно Просто прочитайте правильную документацию – Peter

+0

Я не хочу, чтобы tomcat отображал любую страницу с ошибкой вообще –

ответ

5

Установка статуса ответа на 401 будет только указывать браузеру «запрещено», а tomcat отобразит страницу с ошибкой. Он сам по себе не инициирует процесс аутентификации.

Чтобы запустить авторизацию, вам нужно добавить еще один заголовок в ответ:

httpResponse.setHeader("WWW-Authenticate", "Basic realm=\"MyApp\""); 

где «MyApp» это имя нужной области HTTP AUTH. Добавьте этот заголовок, и браузер отобразит диалоговое окно auth и повторит запрос.

Вы должны знать, что tomcat все равно отправит страницу с ошибкой вместе с заголовками, это значит, что браузер не отобразит ее, пока ответ содержит заголовок auth.

3

Недовольный страницы ошибок по умолчанию, которые приходят с Tomcat? Вы можете определить свои собственные страницы ошибок в файле web.xml. В приведенном ниже примере мы определяем 2 веб-страницы - server_error.html и file_not_found.html - которые будут отображаться, когда сервер обнаруживает ошибку 500 или ошибку 404 соответственно.

<error-page> 
    <error-code>500</error-code> 
    <location>/server_error.html</location> 
</error-page> 
<error-page> 
    <error-code>404</error-code> 
    <location>/file_not_found.html</location> 
</error-page> 

Вы должны иметь в виду, однако, что порядок тегов для файла web.xml очень важен. Если порядок в файле web.xml неверен, Tomcat будет выводить ошибки при запуске

источник: http://linux-sxs.org/internet_serving/c581.html

+0

Нет, я не хочу, чтобы tomcat отображал любую страницу ошибок –

+1

@Maurice Perry, я считаю, что Питер пытается вам сказать, что вы должны настроить свои страницы ошибок так, как он упомянул. Но на страницах с ошибками вы можете перенаправить на страницу аутентификации, где вы попросите пользователя указать его учетные данные. –

3
страница ошибки

кота может происходить потому, что вы не включая достаточно информации для вашего браузера, чтобы сделать то, что вы хотите следующий. Хотя вы видите страницу, у нее не будет кода состояния 200. Если вы проверите заголовок, вы увидите там 401. Я подозреваю, что ваш браузер не знает, что делать дальше.

Вы не заявляете в своем вопросе, что хотите сделать браузеру, но, возможно, вам нужно включить дополнительную информацию в HTTP-заголовок сообщения об ошибке 401. Вы можете переопределить сообщения об ошибках по умолчанию, добавив узел error-page в ваш файл web.xml. Это может быть сервлет или JSP, поэтому вы можете предоставить некоторую логику, а не только статическую страницу.

<error-page> 
    <error-code>401</error-code> 
    <location>/my401.jsp</location> 
</error-page> 
0

Почему бы не использовать логин-конфигурации, безопасности ограничений и безопасности роль элементы из web.xml для этого? Маленький пример:

<login-config> 

    <auth-method>FORM</auth-method> 

    <realm-name>Your-Name</realm-name> 

    <form-login-config> 

    <form-login-page>/login.jsp</form-login-page> 

    <form-error-page>/error_login.xhtml</form-error-page> 

    </form-login-config> 

</login-config> 


<security-constraint> 

    <web-resource-collection> 

     <web-resource-name>Some-Name</web-resource-name> 

     <url-pattern>/path/to/directory/*</url-pattern> 

    </web-resource-collection> 

    <auth-constraint> 

     <role-name>USER</role-name> 

     <role-name>ADMIN</role-name> 

    </auth-constraint> 

</security-constraint> 


<security-role> 

    <description>Role for all users</description> 

    <role-name>USER</role-name> 

</security-role> 


<security-role> 

    <description>role for all admins</description> 

    <role-name>ADMIN</role-name> 

</security-role> 

При том, что пользователи, которые хотят посетить ваш/путь/к/каталогу/или любого из его подкаталогов необходимо войти в систему. Доступ будет предоставлен только в том случае, если у пользователя есть роль USER или ADMIN. Вы можете установить это даже в корневой каталог, чтобы все пользователи должны были сначала зарегистрироваться.

+0

Обычная проверка подлинности является обязательным требованием. Это долгая история ... –

1

Ответы выше не на 100% понятны, так что это помогло мне. У меня была статическая страница 401.html и возникла та же проблема, что и исходный плакат. Все, что я сделал, это изменить страницу на 401.JSP страницы и сваливать это на самом верху:

<% 
String realmName = "A nice name to show as the title of on the pop-up"; 
response.setHeader("WWW-Authenticate","Basic realm=\"" + realmName + "\""); 
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
%> 

following post on coderanch.com служил в качестве руководства.

Таким образом, в двух словах, уместный раздел web.xml выглядит следующим образом:

<!-- Internal server error. --> 
    <error-page> 
    <error-code>500</error-code> 
    <location>/errors/500.html</location> 
    </error-page> 

    <!-- Not found. --> 
    <error-page> 
    <error-code>404</error-code> 
    <location>/errors/404.html</location> 
    </error-page> 

    <!-- Unauthorized. --> 
    <error-page> 
    <error-code>401</error-code> 
    <location>/errors/401.jsp</location> 
    </error-page> 

И 401.jsp выглядит следующим образом:

<% 
String realmName = "A nice name to show as the title of on the pop-up"; 
response.setHeader("WWW-Authenticate","Basic realm=\"" + realmName + "\""); 
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>401 Unauthorized</title> 
<meta name="description" content="The server has not found anything matching the Request-URI."> 
<style type="text/css"> 
body {background-color:ffffff;background-image:url(http://);background-repeat:no-repeat;background-position:top left;background-attachment:fixed;} 
h3{font-family:Arial;color:000000;} 
p {font-family:Arial;font-size:14px;font-style:normal;font-weight:normal;color:000000;} 
</style> 
</head> 
<body> 
<h3>401 Unauthorized</h3> 
<p>The request requires authentication.</p> 
</body> 
</html> 
+0

Это отлично подойдет для меня. Просто у меня есть одна проблема, когда я нажимаю кнопку «Отмена» или не удается правильно аутентифицироваться на ** BASIC ** всплывающее окно авторизации, в результате я получаю пустую страницу. Могли ли вы найти решение для этого случая? – Igor

Смежные вопросы