【问题标题】:Servlet 3.0 logout doesn't workServlet 3.0 注销不起作用
【发布时间】:2011-02-22 22:05:33
【问题描述】:

我对 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() 函数。相反,它似乎是一种“缓存”机制,可以重新填充凭据并取消我的注销...

管理员

基础

===^===

===v===

管理员

基础

这是我的 firefox 的问题,还是我在 Servlet 代码中缺少的东西?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    参考文献

    【讨论】:

    • 基于表单的身份验证似乎可以正常工作,虽然 BASIC 弹出框非常方便,但我想我不是唯一一个尝试以这种方式使用它的人!
    • @Pascal Thivent 所有链接都已损坏
    【解决方案2】:

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

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

    使用过滤器,您可以在整个系统范围内强制执行此操作。

    【讨论】:

    • 这样的 login.jsp 会是什么样子?我希望我的 Web 应用程序的用户能够使用基本身份验证使用其他帐户登录。
    猜你喜欢
    • 2016-12-24
    • 2012-07-25
    • 2020-07-13
    • 2011-05-05
    • 2017-01-07
    • 2012-06-19
    • 2018-06-09
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多