2009-08-04 431 views
5

我想从webapp返回一个401错误代码来触发一个基本的认证过程,但tomcat劫持响应以显示其状态报告页面。 有没有办法阻止tomcat这样做,并让错误代码一直到浏览器?避免tomcat状态报告

UPDATE 我的错误:我忘了WWW-Authenticate头

+1

Tomcat没有任何劫持,如果回报默认的状态报告页面,然后你只是没有正确设置它 只是阅读正确的文档 – Peter 2009-08-04 06:04:07

+0

我不希望tomcat显示任何错误页面任何 – 2009-08-04 06:08:38

回答

5

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

要触发权威性,就需要另一个头添加到响应:

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

其中“MyApp的”是你想要的HTTP认证领域的名称。添加该标题,浏览器将弹出一个授权对话框并重试该请求。

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

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

+0

不,我不希望tomcat显示任何错误页面 – 2009-08-04 06:07:20

+1

@Maurice Perry,我相信Peter想告诉你的是你应该按照他提到的方式设置你的错误页面。但是在错误页面中,您可以重定向到身份验证页面,在该页面中要求用户指定其凭据。 – 2009-08-04 06:48:25

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> 
0

为什么不使用登录,配置安全约束安全角色从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角色时,才会授予访问权限。您甚至可以将其设置为根目录,以便所有用户都必须先登录。

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>