我遇到了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代码中缺少的东西?
答案 0 :(得分:4)
由于
logout()
功能,我总是希望看到用户名/登录窗口。相反,它似乎是一个“缓存”机制,它重新填充凭证并取消我的注销......
这就是HTTP BASIC AUTH的设计方式,它允许所有身份验证状态保存在客户端中。换句话说,不可能使用基本/摘要式身份验证注销,服务器无法阻止客户端缓存并在后续请求到服务器时重新发送BASIC身份验证器。
我的建议是使用基于表单的身份验证和login
的HTTPServletRequest
方法。
答案 1 :(得分:1)
它既不是。登录后,浏览器将始终将您的用户ID和密码传递给URL。直到重新启动浏览器。据我所知,每个浏览器都这样做。据我所知,目前无法告诉浏览器忘记凭据。
但是,一旦退出,您会看到您的会话会有所不同。通常的解决方案是在会话中添加某种变量。说“登录”。如果缺少此变量,您知道用户必须先登录,然后您将重定向到login.jsp。一旦用户通过这个jsp你再次设置这个变量。
使用过滤器可以强制执行此系统。