2017-10-04 65 views
-1

回來的webapp,我們使用struts2的攔截器攔截Struts2的攔截器(查看渲染攔截後)不重定向請求之前稱爲來自瀏覽器

public String intercept(ActionInvocation invocation) throws Exception { 
    TransactionService.startTransaction(); 
    invocation.invoke(); 
    TransactionService.commitTransaction(); 
} 

時的

僞代碼有事務管理操作返回'重定向'(302),有時重定向的請求在調用'TransactionService.commitTransaction()'之前來到服務器。 (看起來像網絡電話比棧展開快)

下面拍攝日誌消息解釋了這個

2017-10-04 09:18:37,693 [task-37] DEBUG (interceptors) TransactionInterceptor begin 
2017-10-04 09:18:37,949 [task-38] DEBUG (interceptors) TransactionInterceptor begin 
2017-10-04 09:18:37,963 [task-37] DEBUG (interceptors) TransactionInterceptor commit 
2017-10-04 09:18:37,955 [task-38] ERROR (interceptors) SecurityInterceptor: Failed to execute Action: 

上述日誌任務-37(線程)假設保存/更新數據庫的一些記錄,並出具重定向刷新視圖,其攔截器將提交事務。

但重定向線程(任務 - 38)在提交發生之前到達了服務器。

我在看PreResultListener或'Chain Result'。 (這兩個選項都有自己的問題)我非常感謝任何輸入來解決這個問題

在此先感謝。

+0

如果你不行,你不應該編寫自己的攔截器。 –

+0

它的舊代碼,所以我不能在那裏做很多 – user1919511

+0

你不能對這段代碼做任何事情,因爲這段代碼不起作用 –

回答

0

這是一個工作代碼,類似於PreResultListener。

public String intercept(ActionInvocation invocation) throws Exception { 
    invocation.addPreResultListener(new PreResultListener() { 
     @Override 
     public void beforeResult(ActionInvocation invocation, String resultCode) { 
      try { 

       // commit based on the resultCode comparision 
       if (StringUtils.equals(resultCode,"302_redirect") { 
        TransactionService.commitTransaction(); 
       } 
       // or commparision based on the redirect handler 
       // Class names are from struts-default.xml 
       /* 
       String resultConfigClassName = invocation.getProxy().getConfig().getResults().get(resultCode).getClassName(); 
       if (StringUtils.equals(resultConfigClassName,"org.apache.struts2.dispatcher.ServletRedirectResult") 
         || StringUtils.equals(resultConfigClassName, "org.apache.struts2.dispatcher.ServletActionRedirectResult")) { 
        TransactionService.commitTransaction(); 
       } 
       */ 
      } 
      catch (Exception e) { 
       // Ignore don't do anything 
      } 
     } 
    }); 

    TransactionService.startTransaction(); 
    invocation.invoke(); 
    TransactionService.commitTransaction(); 
}