Servlet 3.0 注销不起作用

4
我遇到了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

===^===

null

null

===v===

管理员

BASIC

这是我的Firefox有问题吗?还是我在Servlet代码中漏掉了什么?

2个回答

4
我总是期望看到用户名/登录窗口,因为logout()函数。但实际上,它似乎是一种“缓存”机制,重新填充凭据并取消我的注销...

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

我的建议是使用基于表单的身份验证以及HTTPServletRequestlogin方法。

参考资料


基于表单的身份验证似乎运行正常,虽然基本弹出框非常方便,我想我不是唯一尝试以这种方式使用它的人! - Kevin
@Pascal Thivent 所有链接都已失效。 - kinkajou

1

不是这样的。一旦登录,浏览器将始终将您的用户ID和密码传递给URL,直到您重新启动浏览器。据我所知,每个浏览器都是如此。据我所知,目前没有办法告诉浏览器忘记凭据。

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

使用过滤器,您可以在整个系统中强制执行此系统。


这样的login.jsp会是什么样子?我希望我的Web应用程序用户能够使用基本身份验证登录不同的帐户。 - kuester2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接