代码之家  ›  专栏  ›  技术社区  ›  user1919511

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

  •  -1
  • user1919511  · 技术社区  · 7 年前

    拦截器的伪代码

    public String intercept(ActionInvocation invocation) throws Exception {
        TransactionService.startTransaction();
        invocation.invoke();
        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:
    

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

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

    提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   user1919511    7 年前

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