【问题标题】:Spring-Security with /j_spring_security_logout possibly not logging out fully带有 /j_spring_security_logout 的 Spring-Security 可能未完全注销
【发布时间】:2012-05-07 05:32:49
【问题描述】:

因此,我正在尝试确定这是错误还是浏览器缓存,或者我是否遗漏了某些内容,但是当我注销时,我可以访问以前访问过的任何页面。我什至有一个对休息端点的 ajax 调用,当我调用它时,我打印响应并得到 200 ok。

现在,如果我单击注销,它会返回带有无效会话 url 参数的登录页面。所以看起来它正在尝试删除会话,而且如果我完全关闭浏览器,而不仅仅是我无法再访问以前能够访问的页面的选项卡。但是如果我不关闭浏览器,我可以访问我已经访问过的任何页面,我还没有访问过的页面会将我转发到登录页面。这让我想知道它是否是浏览器缓存问题,但是 ajax 请求上的 200ok 让我怀疑。

Spring-Security 3.1.0 版

这是我的注销配置。

<logout invalidate-session="true" logout-success-url="/login-page.html?logout=true"
        logout-url="/j_spring_security_logout" />
    <session-management invalid-session-url="/login-page.html?session=invalid">
        <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    </session-management>

在 web.xml 中我添加了这个监听器

<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

更新

确实是浏览器缓存问题,为了解决这个问题,我添加到 DispatcherServlet xml

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
     <property name="cacheSeconds" value="0" />
 </bean>

还为head添加了META标签

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">

现在这会禁用我所有页面和休息方法的缓存。

【问题讨论】:

    标签: spring-security


    【解决方案1】:

    确实看起来像一个缓存问题:

    • 尝试使用一些额外的随机参数访问已访问过的页面
    • ...尝试同样的 AJAX 调用(只需附加 ?random= + Math.random()
    • 还可以尝试使用 AJAX POSTing,因为 GET 更有可能被缓存。
    • 最后查看 Firebug 或任何其他监控工具(或服务器端的访问日志)以确认请求已缓存。如果缓存是问题,请调查浏览器为何决定缓存您的资源。

    【讨论】:

    • 我看了看萤火虫,它很奇怪,有时,并非总是如此,我得到一个 302 的其余电话。打算试试你的建议。
    • 好吧,绝对是缓存问题,您的回复让我想到尝试将服务器置于调试模式,在 get 中添加了一个断点,我只在第一次访问服务器时才点击它。否则它永远不会击中它。现在如何防止 Jersey 休息方法在浏览器中的缓存。
    • 将此添加到 DispatcherServlet xml 文件并用于禁用缓存
    猜你喜欢
    • 2014-05-01
    • 1970-01-01
    • 2015-12-10
    • 2020-04-02
    • 2015-06-30
    • 1970-01-01
    • 2015-01-03
    • 2018-08-27
    • 2023-03-03
    相关资源
    最近更新 更多