当前位置: 首页 > 知识库问答 >
问题:

execAndWait侦听器在等待后未重定向到成功页面

冯元徽
2023-03-14

我有一个登录屏幕,其中将发生一些用户输入验证,用户将被验证,最后重定向到欢迎屏幕。

以下是登录操作的拦截器定义:

<package name="default" extends="struts-default" namespace="/">
    <interceptors>  
        <interceptor name="myInterceptor" 
            class="com.interceptor.MyInterceptor"></interceptor>

        <interceptor-stack name="newStack">
            <interceptor-ref name="myInterceptor"/>             
            <interceptor-ref name="defaultStack" />
            <interceptor-ref name="execAndWait">
                <param name="delay">100</param>
                <param name="delaySleepInterval">500</param>
            </interceptor-ref>              
         </interceptor-stack> 
    </interceptors>

    <action name="login"
        class="com.action.LoginAction"> 
        <interceptor-ref name="newStack"/>
        <result name="success">common/Welcome.jsp</result>
        <result name="wait">common/wait.jsp</result>
        <result name="error">Login.jsp</result>
        <result name="input">Login.jsp</result>
    </action>
</package>

以下是登录操作的执行方法

   if (isUserAuthenticated) {
        // Some background processing for logging purpose           
        return "success";
    } else {            
        addActionError(getText("error.login"));
        return "error";
    }

我对此代码有几个问题:

1) 对于经过身份验证的用户,等待。jsp页面正在显示,但重定向到欢迎。jsp没有发生。

2) 对于未经身份验证的用户,我得到以下异常:

java.lang.NullPointerException
at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:361)
at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:208)
at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:123)
at com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:103)
at com.infy.action.LoginAction.execute(LoginAction.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
at org.apache.struts2.interceptor.BackgroundProcess$1.run(BackgroundProcess.java:57)
at java.lang.Thread.run(Thread.java:662)

共有3个答案

公孙联
2023-03-14

在操作或应用程序提供的资源中找不到键“error.login”,或者您使用了错误的区域设置。这意味着您没有配置i18n资源。要解决您的问题,您需要创建LoginAction。属性文件并将密钥放入其中

error.login = Error login

如果您使用的是文章中未看到的全局属性文件,请在此处添加此键。

班展
2023-03-14

NPE之所以发生,是因为带有execAndWait拦截器的操作在单独的线程中运行,并且您正在调用使用ActionContextgetText方法ActionContext是线程本地的,这意味着ActionContext中存储的值对于每个线程都是唯一的。

为了在进程结束后显示成功页面,您需要不时刷新页面。在示例中,它是通过metahttp equiv=“refresh”完成的。

<meta http-equiv="refresh" content="5;url=<s:url includeParams="all" />"/> 
扈高逸
2023-03-14
  1. execAndWait使操作在新线程中执行

要解决此问题,需要将父线程ActionContext复制到execAndWait线程中。可以通过扩展BackgroundProcess类,实现beforeInvocation()afterInvocation()方法,扩展ExecuteAndWaitInterceptor,实现getNewBackgroundProcess()方法来实现这一点。

public class YourExecAndWaitInterceptor extends ExecuteAndWaitInterceptor {

    private static final long serialVersionUID = 1L;


    /**
     * {@inheritDoc}
     */
    @Override
    protected BackgroundProcess getNewBackgroundProcess(String arg0, ActionInvocation arg1, int arg2) {
        return new YourBackgroundProcess(arg0, arg1, arg2, ActionContext.getContext());
    }

}



public class YourBackgroundProcess extends BackgroundProcess {

    private final ActionContext context;

    public YourBackgroundProcess(String threadName, ActionInvocation invocation, int threadPriority, ActionContext context) {
        super(threadName, invocation, threadPriority);
        this.context = context;
     }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void beforeInvocation() {
        ActionContext.setContext(context);
    }

    /**
     * {@inheritDoc}
     */
   @Override
    protected void afterInvocation() {
        ActionContext.setContext(null);
    }

}
 类似资料:
  • 尝试在发送电子邮件后从node.js和express.js页面重定向我的页面。消息被发送,我在我的终端中得到了console.log()(使用morgan进行日志记录),但它没有将我重定向到成功页面,并且我在浏览器中没有得到一个console.log错误。它只是停止,然后我得到一个本地主机没有发送任何数据错误。以前从未使用过nodemailer,但我设法发送了消息,只是在重定向到新页面时遇到了问题

  • 我有一个控制器类,它需要为列表中的每个项目执行各种异步操作: 对于每个A 播放音频并等待完成 等t秒 对于A的每个子部分B: 播放音频并等待 等待t2秒 当我的方法被激发。我试着回复听众: 但最后我还是无法摆脱内部循环,这让我觉得整个想法都行不通。我已经查看了未来的界面,但这似乎也不是我想要的。 我知道我可以用一堆变量来解决这个问题,以跟踪我在状态流中的位置,但是带有一些框架的循环会更干净。谢谢:

  • 我有一个页面,它用ajax加载动态内容,然后在一定时间后重定向(不固定)。我如何强制Selenium Webdriver等待页面重定向,然后立即转到另一个链接?

  • 问题内容: 我有一个单击按钮并重定向到用户仪表板的测试。发生这种情况时,Webdriver返回: 为了解决这个问题,我将插入到发生重定向的位置,并假设我的CPU使用率很低,这可以解决此问题。但是,2000 ms是任意的并且很慢。是否有类似的东西会等到Angular在重定向页面上加载之前? 问题答案: 您认为这样的事情对您有用吗?最多需要等待10秒,URL才能包含文本“ pageTwo”或您输入的任

  • 我在模态窗口中有登录表单。成功登录后,用户被重定向到< code>/页面。我正试图找到一种方法,在登录后留在联系页面或另一个页面。如何做到这一点?我的代码是:

  • 问题内容: 我知道之前曾有人问过这个问题,但是我在这里面临一个特殊的问题。 我使用Spring Security 3.1.3。 我的Web应用程序中有3种可能的登录案例: 通过登录页面登录:确定。 通过受限页面登录:也可以。 通过非受限页面登录:不好,…每个人都可以访问“产品”页面,并且用户可以在登录后发表评论。因此,同一页面中包含一个登录表单,以允许用户进行连接。 情况3)的问题是我无法设法将用