不了解Spring SessionAttribute和Autowiring

时间:2013-12-10 17:02:17

标签: spring spring-mvc

我不是春天的专家,而且我正面临一种我不理解的行为......

我的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);
    }
}

2 个答案:

答案 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");