Избегание отчета о состоянии tomcat

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

ОБНОВЛЕНИЕ Моя ошибка: я забыл заголовок WWW-Authenticate


person Maurice Perry    schedule 04.08.2009    source источник
comment
tomcat ничего не угоняет, если он возвращает страницу отчета о состоянии по умолчанию, значит, вы просто неправильно его настроили. Просто прочитайте правильную документацию.   -  person Peter    schedule 04.08.2009
comment
Я не хочу, чтобы tomcat отображал какую-либо страницу с ошибкой   -  person Maurice Perry    schedule 04.08.2009


Ответы (5)


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

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

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

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

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

person skaffman    schedule 04.08.2009

Недовольны страницами ошибок по умолчанию, которые поставляются с 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

person Peter    schedule 04.08.2009
comment
@ Морис Перри, я полагаю, что Питер пытается сказать вам, что вы должны настроить свои страницы ошибок так, как он упомянул. Но на ваших страницах ошибок вы можете сделать перенаправление на страницу аутентификации, где вы попросите пользователя указать свои учетные данные. - person Shivasubramanian A; 04.08.2009

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

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

<error-page>
    <error-code>401</error-code>
    <location>/my401.jsp</location>
</error-page>
person banjollity    schedule 04.08.2009

Ответы выше не на 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);  
 %>  

Отображаемый следующий пост на 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>
person Nico de Wet    schedule 28.08.2010
comment
Это отлично сработало для меня. Просто у меня есть одна проблема, когда я нажимаю кнопку Отмена или не могу правильно аутентифицироваться во всплывающем окне авторизации BASIC, в результате я получаю пустую страницу. Удалось ли вам найти решение и для этого случая? - person Igor; 16.06.2011

Почему бы не использовать для этого элементы login-config, security-constraint и security-role из 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>

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

person seb    schedule 04.08.2009