Вопрос

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

Обновите мою ошибку:Я забыл заголовок WWW-Authenticate

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Недовольны страницами ошибок по умолчанию, поставляемыми с Tomcat?Вы можете определить свои собственные страницы ошибок в файле web.xml.В примере, показанном ниже, мы определяем две веб-страницы — 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

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

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

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

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

Почему бы не использовать логин-конфигурация, ограничение безопасности и роль безопасности элементы из 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/ или любой из его подкаталогов, необходимо будет войти в систему.Доступ будет предоставлен только в том случае, если у пользователя есть роль ПОЛЬЗОВАТЕЛЬ или АДМИН.Вы можете установить это даже для корневого каталога, чтобы всем пользователям приходилось сначала входить в систему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top