2013-12-10 39 views
0

我不是一个春天专家,我现在面临一个问题,我不明白...不理解春季SessionAttribute和自动装配

我有我的控制器一SessionAttribute“用户”,即自动连接到我的bean用户。 当我登录时,我的用户被填充一些值等。

当我注销时,我期望我的会话属性“用户”将被重置,但它保留其值。

那么问题在哪里?我的登出无法正常工作吗?或者是正常的,那么有人能解释我在春天发生了什么吗?

下面是一个代码示例,了解我的问题:

@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); 
    } 
} 
+1

您如何注销?你可以发布代码注销 – Anugoonj

+0

你的'User' bean在哪里声明? –

回答

2

现在你已经张贴User

@Component 
public class User 
{ 
    ... 
} 

,你会发现它是有辛格尔顿范围。此处自动装配的豆

@Autowired 
private User user; 

是单例实例。无论您正在处理什么会话或请求,并且无论您何时注销,它都将始终保持不变。所以到现在为止,您的所有用户都共享相同的User实例。

您可以将其更改为具有会话范围。

@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) 
@Component 
public class User 
{ 
    ... 
} 

现在每个会话都有自己的实例可以使用。

+0

我不太明白代理模式是做什么的,但它起作用,谢谢!我没有看到默认范围是单身阅读文档 – thibon

+0

@ thibon不客气。对于Spring来实现会话范围,它需要将对象包装在代理中,该代理根据会话始终为您提供不同的对象。有两种类型的代理,Java JDK代理和CGLIB代理。该属性指定要使用哪个属性。你可以在文档中阅读更多关于它的信息。 –

0

我认为SimpleUrlLogoutSuccessHandler没有清除session的内容。

SimpleUrlLogoutSuccessHandler只调用在AbstractAuthenticationTargetUrlRequestHandlerhandle()方法,它的Javadoc说:

调用由determineTargetUrl方法返回的URL的配置RedirectStrategy。 如果响应已被提交,则不会执行重定向。

简单的解决办法是通过除去从session这个属性:

request.getSession().removeAttribute("user");