如何在LogoutSuccessHandler中访问会话属性?

时间:2016-12-27 09:08:52

标签: java spring spring-mvc session spring-security

在Spring MVC应用程序中,我正在尝试实现自定义注销成功处理程序。此处理程序应访问会话属性并根据其值进行一些查询和记录。

实施的相关部分:

  1. 安全配置:
  2. <http ...> <logout success-handler-ref="logoutSuccessHandler"/> </http>

    <beans:bean id="logoutSuccessHandler" class="some.package.LogoutSuccessHandler">
        <beans:constructor-arg value="/login" />
    </beans:bean>
    
    1. 处理程序本身:
    2. public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
      
          @Autowired
          private SomeService someService;
      
          public LogoutSuccessHandler(String defaultTargetUrl) {
              this.setDefaultTargetUrl(defaultTargetUrl);
          }
      
          @Override
          public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
                  throws IOException, ServletException {
              String sessionAttribute = request.getSession().getAttribute("someAttribute").toString();
              someService.doSomething(sessionAttribute);
              super.onLogoutSuccess(request, response, authentication);
          }
      }

      我在用户登录时向会话添加一些属性。它们在不同的控制器请求期间可见。问题是,当我尝试在注销期间访问会话属性时,它们都消失了。这是否意味着到那时已经发生了注销并且会话信息被清除了?我可以看到SessionId和以前一样。

      所以,我的问题是:会话属性会发生什么,有没有办法在LogoutSuccessHandler中访问它们?

1 个答案:

答案 0 :(得分:2)

<logout success-handler-ref="logoutSuccessHandler" invalidate-session="false"/>

默认值invalidate-session为true,因此您将在处理程序中获得新会话。

当您将此值设置为false时,您可以获得旧会话,并且在完成业务后不要忘记使会话无效。