2014-03-19 59 views
1

如果用戶沒有登錄,我的網絡服務器將阻止對系統的訪問,但是一些用戶可能有多個配置文件,系統只允許用戶登錄選擇其中一個配置文件,即用戶可能是一個普通用戶一些權限和這個相同的用戶可以註銷並以管理員權限再次登錄並可以訪問所有內容。Struts2 - 如何在不使用struts.xml的情況下重定向到一個動作?

當這種情況發生時,我將用戶重定向到強制用戶選擇他/她的配置文件的操作,但服務器不再知道用戶嘗試訪問的操作。我能夠通過ActionInvocation檢索這些信息象下面這樣:

public String initFeature() { 
    final ActionInvocation invocation = ServletActionContext.getActionContext(BaseAction.getRequest()) 
      .getActionInvocation(); 
    final Object action = invocation.getAction(); 
    if (!this.isUserFullyLogged() && !(action instanceof ProfileSelectionAction)) { 
     final Boolean isPendingProfileSelection = (Boolean) this 
       .retrieveSessionAttribute(Constants.PENDING_PROFILE_SELECTION); 
     if (isPendingProfileSelection != null && isPendingProfileSelection.booleanValue()) { 
      this.saveSessionAttribute("action", action); 
      this.saveSessionAttribute("namespace", invocation.getProxy().getNamespace()); 
      return Constants.PROFILE_SELECTION; 
     } 

     return Action.LOGIN; 
    } 
    return Action.SUCCESS; 
} 

當系統達到的文件選擇動作我有用戶嘗試訪問,並禁止這種行爲,並命名空間,但我不知道我必須做什麼來將系統重定向到這個命名空間和操作,因爲我只使用struts.xml文件的操作結果到目前爲止。

+0

也許這會幫助你:http://struts.apache.org/development/2.x/docs/parameters-in-configuration-results.html。 –

+0

'如何通過使用Convention插件註釋來重定向到一個動作而不使用struts.xml?' - > –

+0

當你想返回時,保持攔截器的狀態,因爲你只保存具有名稱空間的動作名稱你應該從動作映射中構建url。 –

回答

1

您可以在struts.xml文件中使用result配置中的參數。創建你的動作類中的兩個屬性,將持有的動作名稱和命名空間和struts.xml一樣使用它們:

<action name="..." class="..."> 
    <result type="redirectAction"> 
    <param name="actionName">${action}</param> 
    <param name="namespace">${namespace}</param> 
    </result> 
</action> 

此外,如果不想創建它們,你已經存儲在會話的變量,您可以使用#session表達式從會話中檢索它們。

<action name="..." class="..."> 
    <result type="redirectAction"> 
    <param name="actionName">${#session.action}</param> 
    <param name="namespace">${#session.namespace}</param> 
    </result> 
</action> 
+0

問題註釋部分中的鏈接建議''和'「有什麼區別?而且結果不應該有名字嗎? –

+0

@PhilippeGioseffi:基本上他們是這樣做的,但是鏈接中的一個放置了一些參數(例如id)。您需要使用'redirectAction'結果的'actionName'和'namespace'參數來實現你想要的。結果的默認名稱是'success',所以如果你從action返回'success',你不需要把它放在結果配置中。 –

+0

在我的情況下,如果我沒有在'result'中定義一個名字,* success *會將用戶重定向到正常流程。如果我想定義這樣一個ID參數,我不能使用'redirectAction'? –

相關問題