【发布时间】:2017-05-11 13:28:47
【问题描述】:
在 Spring MVC 应用程序中,我尝试实现自定义注销成功处理程序。此处理程序应访问会话属性并根据其值进行一些查询和记录。
实现的相关部分:
- 安全配置:
<http ...>
<logout success-handler-ref="logoutSuccessHandler"/>
</http>
<beans:bean id="logoutSuccessHandler" class="some.package.LogoutSuccessHandler">
<beans:constructor-arg value="/login" />
</beans:bean>
- 处理程序本身:
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 中访问它们?
【问题讨论】:
-
使用您需要的属性填充请求并在注销后使用它。另一种选择是在使会话无效之前添加一个钩子。
-
您能否说明如何实施这两种解决方案?
标签: java spring spring-mvc session spring-security