1

我在使用 struts 2 应用程序时遇到问题。用户 1 成功登录并被重定向到某个页面。之后,用户 2 尝试从她的机器登录,她被重定向到用户 1 的登录页面。

我不确定这是 Web 容器(Web 逻辑)的问题还是我的编码中的一些问题。我无法弄清楚我可能会出错的地方以及服务器如何从另一个用户会话中提供数据。

登录操作实现了 sessionaware,我为 session Map 设置了 setter 和 getter。如果登录操作返回成功,用户将被重定向到另一个操作,该操作再次实现会话感知。

问题真的很奇怪。任何人都可以提出任何可能发生的原因。

此外,为了增加复杂性,相同的应用程序耳朵在本地也能正常工作。仅当我尝试将其部署到测试服务器时才会出现此问题。

这是拦截器代码。我不认为这是线程不安全的。

public class UserAuthentication extends AbstractInterceptor
{
    public UserAuthentication()
    {
    }

    public void init(){//System.out.println("init'd");
    }

    public void destroy() {System.out.println("destroyed");}

    public String intercept(ActionInvocation invocation) throws Exception
    {      
        String className = invocation.getAction().toString();
        Map OHRMS = ActionContext.getContext().getSession();

         System.out.println("EmpInfoUpd: " + new Date() + " Inside the interceptor: ");  
        System.out.println("EmpInfoUpd: " + new Date() + " Interceptor called for action: " + className); 
        System.out.println("EmpInfoUpd: " + new Date() + " Now printing the entries of session map from interceptor: " + OHRMS);


        Employee temp = (Employee)OHRMS.get("emp");
        if(temp==null)  
        { System.out.println("EmpInfoUpd: " + new Date() + " The session had no \"emp\" object. Interceptor returned \"login\" ");
            return "login";
        }
        System.out.println("EmpInfoUpd: " + new Date() + " The session had \"emp\" object with Employee name: " + temp.getFullName()+ " Interceptor returned \"login\" ");
            return invocation.invoke();

    }
}
4

2 回答 2

1

我很确定这是由于拦截器不是线程安全的。

我前段时间调试了类似的东西,我在回答与您类似的问题时分享了这种经验,特别是关于如何实现线程安全拦截器:

用户会话在 Tomcat 上搞混了

希望有帮助

编辑

尝试改变这个:

Map OHRMS = ActionContext.getContext().getSession();

对此

Map OHRMS = invocation.getInvocationContext().getSession();

看看它在测试环境中的行为是否相同。

我在我的拦截器中以这种方式访问​​了 Session 并且从来没有遇到过问题。

于 2013-01-17T16:22:29.267 回答
1

感谢大家的努力。问题是我对所有的 struts 页面都使用了 .html 扩展名,而测试网络服务器认为它们是静态页面。所以返回了服务的最后一页。将页面扩展名更改为.action后问题终于解决

于 2013-01-17T21:04:33.850 回答