2011-08-12 28 views
3

我試圖通過實現SessionAware接口(我實現了setSession方法)來訪問攔截器內的會話對象,但是我無法通過這種方式獲取會話對象。Struts 2 Session in interceptor

然後我試着ActionContext.getContext().getSession(),我能夠獲得會話,但我不知道,但它只是第一次在每個瀏覽器中爲每個用戶空出&然後當另一個動作調用。

我認爲會議有問題。爲什麼第一次只給我一個空的會話?它是否在第一次給空會話之後才設置一些東西?

如果是這種情況,那麼每個人都會在他們的第一個請求&上顯示爲guest,然後在第二個請求&上顯示用戶名。

還是我以錯誤的方式獲取會話?

我看到代碼在攔截器中獲取會話,但這對我無效,因爲它無法找到常數HTTP_REQUEST

final ActionContext context = invocation.getInvocationContext(); 

HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); 

HttpSession session = request.getSession(true); 

Object user = session.getAttribute(Constants.USER_HANDLE); 

有沒有解決任何問題的建議?

我忘了提及的東西 - 我的網站是一個安全的網站(https),所以如果用戶沒有登錄,他不會讓他進入網站&,如果他登錄,至少他的用戶名應該是在會議中。它不是嗎?

+0

您需要提供有關何時將用戶名放入會話的更多詳細信息。如何處理登錄名? –

+0

kerberos用戶名被servlet-config攔截器放置在會話中。但是它只把它放在第二個請求上,這導致我有問題...... –

+1

'ServletConfigInterceptor'設置操作的值,但不會在會話中放置任何東西。就目前而言,你的問題並沒有提供足夠的信息來幫助你。 HttpServletRequest.getUserPrincipal()是否包含您需要的用戶信息? –

回答

3

我有一個攔截器,也抓住會話作爲地圖。你有沒有嘗試過這樣的事情?這對我有用。

public String intercept(ActionInvocation actionInvocation) throws Exception { 
    Map session = actionInvocation.getInvocationContext().getSession(); 
+0

是的,我試過這個。這兩種方法都會首次給我一個空的會話。 –

+0

第一次會話不會是空的,直到您添加了一些內容爲止? –

+0

不,它不應該是因爲我正在訪問我的網站的安全連接,所以如果用戶沒有登錄,網站會提示他獲得他的憑據... –

0

您可以使用下面的返回HttpSession - 創造它,如果它不存在。

HttpSession session = ServletActionContext.getRequest().getSession(true); 

如果你需要,而不是地圖,那麼你可以調用最後一次通話後,這種權利(因爲你通過真,會議將已創建,並在下次調用會返回一個空會話映射)。

Map<String, Object> session = ActionContext.getContext().getSession(); 

或者,您可以在您的堆棧早期使用CreateSessionInterceptor,從而使會話由你需要它的時候創建的。然後,使用上面的地圖示例來獲取它。

僅供參考:ServletActionContextActionContext的子類,它只是提供方便的方法來獲取請求和響應,而不需要像您在示例中嘗試使用的那樣使用常量。

+0

是的我可以創建一個會話,但這不是我可以在我的情況下做。我需要從會話中獲取kerberos用戶名,因此創建會話對我來說沒有用處。我希望你明白我的觀點。 –

+0

什麼是將kerberos用戶名放入會話中? –

+0

不應該在那裏,如果用戶登錄? 我在第二個動作調用中自動獲取用戶名,我沒有做任何事情將它放在第二個請求上。 –

0

試試這個。它在struts 2.0.14中爲我工作。

public String intercept(ActionInvocation ai) throws Exception { 

    Map session = ActionContext.getContext().getSession(); 
-1

添加導入:

import org.apache.struts2.StrutsStatics; 
+0

請問您可以添加關於此導入爲何有用的附加信息? –

0

你可以使用ActionContext中本身就攔截了會議...請參考下面的代碼片段:

SessionMap<String, Object> session = ActionContext.getContext().getSession(); 

或者你也可以按照這個方法: 請求可在ActionContext的實例,這是通過ThreadLocal的提供。

HttpServletRequest request = ServletActionContext.getRequest(); 
HttpSession session = request.getSession(true);