Servlet 3.0注销不起作用

时间:2010-05-23 12:41:50

标签: java security java-ee java-ee-6 servlet-3.0

我遇到了Servlet 3.0的身份验证功能问题:

在Servlet v3中使用此代码:

log.info(""+request.getUserPrincipal());
log.info(""+request.getAuthType());
log.info("===^===");
request.logout() ;
log.info(""+request.getUserPrincipal());
log.info(""+request.getAuthType());
request.authenticate(response) ;
log.info("===v===");
log.info(""+request.getUserPrincipal());
log.info(""+request.getAuthType());

由于logout()功能,我总是希望看到用户名/登录窗口。相反,它似乎是一个“缓存”机制,它重新填充凭证并取消我的注销......

  

管理

     

BASIC

     

=== ^ ===

     

     

     

=== v ===

     

管理

     

BASIC

我的Firefox是一个问题,还是我在Servlet代码中缺少的东西?

2 个答案:

答案 0 :(得分:4)

  

由于logout()功能,我总是希望看到用户名/登录窗口。相反,它似乎是一个“缓存”机制,它重新填充凭证并取消我的注销......

这就是HTTP BASIC AUTH的设计方式,它允许所有身份验证状态保存在客户端中。换句话说,不可能使用基本/摘要式身份验证注销,服务器无法阻止客户端缓存并在后续请求到服务器时重新发送BASIC身份验证器。

我的建议是使用基于表单的身份验证和loginHTTPServletRequest方法。

参考

答案 1 :(得分:1)

它既不是。登录后,浏览器将始终将您的用户ID和密码传递给URL。直到重新启动浏览器。据我所知,每个浏览器都这样做。据我所知,目前无法告诉浏览器忘记凭据。

但是,一旦退出,您会看到您的会话会有所不同。通常的解决方案是在会话中添加某种变量。说“登录”。如果缺少此变量,您知道用户必须先登录,然后您将重定向到login.jsp。一旦用户通过这个jsp你再次设置这个变量。

使用过滤器可以强制执行此系统。