避免tomcat状态报告

时间:2009-08-04 05:51:19

标签: java tomcat tomcat6

我正在尝试从webapp返回401错误代码以触发基本身份验证过程,但tomcat正在劫持响应以显示其状态报告页面。 有没有办法阻止tomcat这样做,让错误代码一直到浏览器?

UPDATE 我的错误:我忘记了WWW-Authenticate标题

5 个答案:

答案 0 :(得分:5)

将响应状态设置为401只会告诉浏览器“禁止”,tomcat将显示错误页面。它本身不会触发身份验证过程。

要触发身份验证,您需要在响应中添加另一个标头:

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

其中“MyApp”是您所需的HTTP身份验证领域的名称。添加该标题,浏览器将弹出一个auth对话框并重试该请求。

你应该知道tomcat仍然会发送错误页面和标题,只要响应包含auth标题,浏览器就不会显示它。

答案 1 :(得分: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

答案 2 :(得分:3)

Tomcat错误页面可能正在发生,因为您没有为浏览器提供足够的信息来执行下一步操作。虽然您看到的是一个页面但它没有200状态代码。如果你检查标题,你会看到一个401。我怀疑这是你的浏览器,不知道下一步该做什么。

您没有在问题中说明您希望浏览器做什么,但您可能需要在401错误消息的HTTP标头中包含额外信息。您可以通过向web.xml文件添加error-page节点来覆盖默认错误消息。该位置可以是servlet或JSP,因此您可以提供一些逻辑而不是静态页面。

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

答案 3 :(得分: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>

答案 4 :(得分:0)

为什么不使用web.xml中的 login-config security-constraint security-role 元素?小例子:

<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角色时才会授予访问权限。您可以将其设置为根目录,以便所有用户必须先登录..