Как избежать сообщения о состоянии кота - PullRequest
5 голосов
/ 04 августа 2009

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

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

Ответы [ 5 ]

5 голосов
/ 04 августа 2009

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

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

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

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

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

3 голосов
/ 04 августа 2009

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

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

<error-page>
    <error-code>401</error-code>
    <location>/my401.jsp</location>
</error-page>
3 голосов
/ 04 августа 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

1 голос
/ 29 августа 2010

Ответы выше не ясны на 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>
0 голосов
/ 04 августа 2009

Почему бы не использовать для этого элементы login-config , ограничения безопасности и 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 / каталог / или любой из его подкаталогов, должны будут войти в систему. Доступ будет предоставлен только в том случае, если у пользователя есть роль USER или ADMIN. Вы можете установить его даже в корневой каталог, чтобы все пользователи сначала должны были войти в систему.

...