我不是春天的专家,而且我正面临一种我不理解的行为......
我的Controller中有一个SessionAttribute“user”,它自动连接到我的bean用户。 当我登录时,我的用户会填充一些值等。
当我退出时,我希望我的会话属性“user”会被重置,但它会保留其值。
问题出在哪里?我的注销无法正常工作吗?或者这是正常的,所以有人可以解释一下我在Spring里面发生了什么吗?
这是一个代码示例,用于理解我的问题:
@Controller
@SessionAttributes("user")
public class HomeController
{
@Autowired
private User user;
// Session Attribute
@ModelAttribute("user")
public User setSessionAttribute()
{
LOGGER.debug("Adding user to session...");
return user;
}
...
}
编辑:注销示例代码和用户声明
我的用户声明如下:
@Component
public class User
{
...
}
要注销我有一个指向/ myapp / j_spring_security_logout的链接,我已经实现了一个注销处理程序:
@Component
public class MyLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler
{
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException
{
//to check if user is in session, but it's not
Enumeration<String> e = request.getSession().getAttributeNames();
//some code needed to log out from my custom security manager
//kill the session (not spring session) and redirect to the specified url
agent.logout("/myapp/login");
super.onLogoutSuccess(request, response, authentication);
}
}
答案 0 :(得分:2)
现在您已发布User
@Component
public class User
{
...
}
您会注意到它具有Singleton范围。豆子在这里自动装配
@Autowired
private User user;
是单例实例。无论您正在处理什么会话或请求,无论您是否退出,它始终都是相同的。到目前为止,您的所有用户都共享了相同的User
实例。
您可以将其更改为具有会话范围。
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class User
{
...
}
现在每个Session都有自己的实例可供使用。
答案 1 :(得分:0)
我认为SimpleUrlLogoutSuccessHandler
没有清除session
的内容。
SimpleUrlLogoutSuccessHandler
仅调用handle()
中的AbstractAuthenticationTargetUrlRequestHandler
方法,Javadoc表示:
使用determineTargetUrl方法返回的URL调用已配置的RedirectStrategy。 如果响应已经提交,则不会执行重定向。
最简单的解决方案是从session
中删除此属性:
request.getSession().removeAttribute("user");