2013-12-10 37 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");