【问题标题】:Avoiding tomcat status report避免tomcat状态报告
【发布时间】:2009-08-04 05:51:18
【问题描述】:

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

更新 我的错误:我忘记了 WWW-Authenticate 标头

【问题讨论】:

  • tomcat 没有劫持任何东西,如果它返回默认状态报告页面,那么您只是没有正确设置它只需阅读正确的文档
  • 我不想让tomcat显示任何错误页面

标签: java tomcat tomcat6


【解决方案1】:

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

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

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

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

您应该知道,tomcat 仍然会将错误页面与标头一起发送,只是只要响应包含 auth 标头,浏览器就不会显示它。

【讨论】:

    【解决方案2】:

    对 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

    【讨论】:

    • @Maurice Perry,我相信彼得试图告诉您的是,您应该按照他提到的方式设置错误页面。但是在您的错误页面中,您可以重定向到身份验证页面,您可以在其中要求用户指定他的凭据。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      上面的答案不是 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>
      

      【讨论】:

      • 这对我很有用。只是,我有一个问题,当我按下 Cancel 按钮或未能在 BASIC 授权弹出窗口上正确验证时,结果我得到空白页。您是否也为这种情况找到了解决方案?
      【解决方案5】:

      为什么不使用 web.xml 中的 login-configsecurity-constraintsecurity-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 时才会授予访问权限。您甚至可以将其设置为根目录,这样所有用户都必须先登录..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2018-03-25
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        相关资源
        最近更新 更多