如何在Spring安全性中编辑定时注销

时间:2011-06-06 21:29:33

标签: java spring logout spring-security

我试图弄清楚Spring轻量级安全的定时注销功能在哪里,以及如何编辑它以使用我的自定义注销方法。 我的理解是存在一个可编辑的定时注销功能,我到目前为止一直无法找到它,如果我这样做,我不确定如何使用我的注销序列。

谢谢, MirroredFate

编辑清晰度:

这是一个web / servlet应用程序。我正在使用acegi安全性。

我现在正在使用Spring会话超时:

In web.xml:
<session-config>
    <session-timeout>5</session-timeout>
</session-config>

我需要一种在发生超时时执行某些代码的方法。但是,我不知道如何做到这一点。

如果我无法使用此方法执行代码,我的理解是acegi有办法使会话超时;但是,我也不知道该怎么做。我已经能够使用acegi在正常注销时执行代码:

<security:logout invalidate-session="true"
                success-handler-ref="Logout"
                logout-url="/logout.html" />
</security:http>

因此,基本上,我如何使用acegi timed logout或会话超时发生同样的事情?

2 个答案:

答案 0 :(得分:8)

HttpSessionListener可能正是您要找的。依赖于Spring的会话管理的问题是,如果用户只是在没有注销的情况下关闭他的浏览器,则永远不会到达invalid-session-url(因为他们从不再发出请求)。

这样的事情:

public class MySessionListner implements HttpSessionListener {
     public void sessionCreated(HttpSessionEvent se) {
          return; //or maybe do something, depends on what you need
     }

     public void sessionDestroyed(HttpSessionEvent se) {
          HttpSession session = se.getSession();
          //do whatever you need to do
     }
 }

然后在web.xml

 <listener>
      <listener-class>com.foo.MySessionListener</listener-class>
 </listener>

这样,每次会话被销毁时都会调用您的代码,而不仅仅是当用户在超时后尝试访问页面时。希望有所帮助。

答案 1 :(得分:2)

会话超时期限由您的应用程序服务器管理(就像您现在在web.xml中一样)。可以在Spring中指定处理会话超时发生时的操作。例如,Spring 3.0可以指定用户在会话失效后向用户重定向的页面。见下文。

<?xml version="1.0" encoding="UTF-8"?>

<b:beans xmlns:b="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sec="http://www.springframework.org/schema/security"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

        <sec:http auto-config="true" access-denied-page="/login">
            <sec:session-management invalid-session-url="/session-timeout" />
            <sec:anonymous enabled="true" />
            <sec:intercept-url ... />
            <sec:form-login ... />
            <sec:logout invalidate-session="true" logout-success-url="/login" />
        </sec:http>
    <!-- Other bean declarations --> 
</b:beans>