2011-11-14 106 views
4

我希望能夠在Struts 2中禁用一個動作的表單驗證,但攔截器堆棧的其餘部分仍然能夠運行。Struts 2:從defaultStack攔截器驗證排除方法

我有一個攔截器,檢查用戶是否登錄,我總是想要執行,但對於某些操作(例如輸入信息),我不希望操作的調用validate

我試圖做類似如下:

<interceptors> 

    <interceptor name="bankingAuthenticator" 
     class="csc309.a4.banking.BankUserAuthenticator"/> 

    <interceptor-stack name="secureBanking"> 
     <interceptor-ref name="bankingAuthenticator"/> 
     <interceptor-ref name="defaultStack"/> 
    </interceptor-stack> 

</interceptors> 

<default-interceptor-ref name="secureBanking"/> 

<action name="Deposit!*" method="{1}" class="csc309.a4.banking.Deposit"> 
    <result name="success">/banking/Deposit.jsp</result> 
    <interceptor-ref name="defaultStack"> 
     <param name="workflow.excludeMethods">choose</param> 
    </interceptor-ref> 
</action> 

但它跳過了雙方的bankingAuthenticator攔截和驗證。

+1

正確;如果您爲單個動作指定了'interceptor-ref',則必須爲該動作指定* all *攔截器!您應該添加您的解決方案作爲答案,然後接受它,以便將來的訪問者可以從您的工作中受益:) –

+0

上面寫的代碼和您在答案中寫的代碼有什麼不同?您能告訴我我沒有得到它正確..... –

+0

@NIVESHSENGAR,不同之處在於存款操作中的攔截器名稱在上面的代碼中是「defaultStack」,而在答案中是「secureBanking」。 – Jengerer

回答

5

我想通了 - 該解決方案是這樣的:

<action name="Deposit!*" method="{1}" class="csc309.a4.banking.Deposit"> 
    <result name="success">/banking/Deposit.jsp</result> 
    <interceptor-ref name="secureBanking"> 
     <param name="workflow.excludeMethods">choose</param> 
    </interceptor-ref> 
</action> 

攔截器的參數可以通過預先攔截名稱參數名被限制在特定的攔截器。在這種情況下,只有workflow攔截器將排除choose方法;其他攔截器仍會針對choose操作方法進行觸發。

+1

太棒了;很高興你想出來了。 –