在重定向请求从浏览器返回之前,不会调用Struts2拦截器(在视图呈现拦截器之后)

在重定向请求从浏览器返回之前,不会调用Struts2拦截器(在视图呈现拦截器之后),struts2,interceptor,Struts2,Interceptor,在webapp中,我们使用struts2拦截器进行事务管理 拦截器的伪代码 public String intercept(ActionInvocation invocation) throws Exception { TransactionService.startTransaction(); invocation.invoke(); TransactionService.commitTransaction(); } 当操作返回“重定向”(302)时,有时重定向的请求

在webapp中,我们使用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:
在上面的日志Task-37(线程)中,假设保存/更新数据库中的一些记录并发出重定向以刷新视图,其拦截器将提交事务

但是重定向线程(Task-38)在提交之前到达了服务器

我正在查看PreResultListener或“链结果”。(两种选择都有自己的问题)我非常感谢为解决这一问题提供的任何意见


提前谢谢

这是一个工作代码,与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();
}

你不应该写你自己的拦截器,如果你不能。它的代码有点旧,所以我不能在那里做很多事情。你不能用这段代码做任何事情,因为这段代码不工作。如何/为什么有不同的线程?操作返回302重定向。某些情况(随机发生,很少发生)浏览器在股票平仓发生之前发出重定向请求(以便事务服务拦截器可以提交)。这就是为什么有两条线。在这种情况下,重定向请求将显示最后提交的数据集。