2014-09-10 48 views
1

我正在开发一个带有Apache Tomcat和Java EE的简单Web应用程序。停止Tomcat以保存用户凭据

即时通讯使用我自己的JDBC域领域来保护和验证用户,我正在使用j_security_check的基本身份验证方法。

我已经实现了一个注销Servlet,一切工作正常。但是当我注销时,我尝试再次登录时,应用程序或浏览器正在使用先前的凭据,它甚至不要求我输入另一个凭证。它只是使用最新的凭证自动登录。只有当我重置服务器并关闭我的浏览器(Chrome)时,tomcat再次询问凭据。

我的目标是防止这种自动登录过程。难道我做错了什么?

更新:我注销Servlet是执行以下操作:

response.setHeader("Cache-Control", "no-cache, no-store"); 
response.setHeader("Pragma", "no-cache"); 

request.getSession().removeAttribute("logonSessData"); 
request.getSession().invalidate(); 
response.sendRedirect(request.getContextPath() + "/index.jsp"); 

我登录的web.xml看起来就像这样:

<security-constraint> 
    <display-name>userConstraint</display-name> 
    <web-resource-collection> 
     <web-resource-name>User pages</web-resource-name> 
     <description/> 
     <url-pattern>/users/*</url-pattern> 
     <url-pattern>/retos/misiones/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>user</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <description/> 
     <transport-guarantee>NONE</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>SPERO</realm-name> 
</login-config> 
<security-role> 
    <description>Usuario registrado de SPERO</description> 
    <role-name>user</role-name> 
</security-role> 
<resource-ref> 
    <description>Spero DataBase Connection Pool</description> 
    <res-ref-name>jdbc/spero</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 
+0

您的注销servlet在做什么?它是否正确地使会话无效? – 2014-09-10 19:49:06

+0

是的,我检查过,当我发送错误的凭据数据时,容器拒绝访问。所以我相信这不是一个身份验证问题 – chntgomez 2014-09-11 01:27:06

回答

0

如果您的应用程序的Servlet 3.0的版本,你应该使用request.logout()您的注销servlet。它应该正确地使会话无效并删除用户凭证,请参阅javadoc request.logout。如果Tomcat没有正确实施,您应该致电session.invalidate()

+0

我也在使会话无效之前清除缓存。这不是根本原因。 – chntgomez 2014-09-11 01:27:29

+1

@chntgomez请将您的注销方法添加到问题中。还有一个解释 - 你不能使用BASIC和j_security_check。 j_security_check是基于表单的。如果您使用Basic,凭证将存储在浏览器中并自动重新发送。您必须切换到窗体。 – Gas 2014-09-11 01:51:16

+0

@chntgomez你是通过表单或浏览器弹出登录?并添加web.xml问题,尤其是''部分。 – Gas 2014-09-12 07:00:30