Java tomcat上的用户会话出错

Java tomcat上的用户会话出错,java,struts2,thread-safety,interceptor,struts2-interceptors,Java,Struts2,Thread Safety,Interceptor,Struts2 Interceptors,我们在IIS7.5后面使用Tomcat6.29,使用spring、hibernate和struts2框架。我们现在开始注意到服务器会话变得混乱,尤其是在Ajax请求中 关于这个问题的更多细节 用户1请求第1页,用户2请求第2页。但是user1得到服务page2,user2得到服务器page1 会话ID也在更改,但在刷新页面时,会提供正确的页面 当用户数量较多时,这个问题似乎发生得更频繁 任何指向问题根源的指针都会有所帮助,代码在用户数量较少的情况下运行良好,并且不会报告此类实例 编辑 web

我们在IIS7.5后面使用Tomcat6.29,使用spring、hibernate和struts2框架。我们现在开始注意到服务器会话变得混乱,尤其是在Ajax请求中

关于这个问题的更多细节

  • 用户1请求第1页,用户2请求第2页。但是user1得到服务page2,user2得到服务器page1
  • 会话ID也在更改,但在刷新页面时,会提供正确的页面
  • 当用户数量较多时,这个问题似乎发生得更频繁
任何指向问题根源的指针都会有所帮助,代码在用户数量较少的情况下运行良好,并且不会报告此类实例

编辑

web.xml


bm
上下文配置位置
类路径:spring/*Context.xml
编码滤波器
org.springframework.web.filter.CharacterEncodingFilter
编码
UTF-8
强制编码
真的
支柱2
org.apache.struts2.dispatcher.ng.filter.strutspreadexecutefilter
编码滤波器
/*
支柱2
/*
org.springframework.web.context.ContextLoaderListener
org.apache.struts2.tiles.StrutsTilesListener
struts.xml


dojo\.*,^struts\*
其他信息

1) 用户通过提交表单登录,登录时我们执行以下操作:

公共类xxxAction扩展了ActionSupport实现了SessionAware
{
公共字符串execute()
{
session.clear();
if(org.apache.struts2.dispatcher.SessionMap的会话实例)
{
尝试
{
((org.apache.struts2.dispatcher.SessionMap)会话);
}
捕获(非法状态){
日志错误(“会话失效失败”,e);
}
//授权码发生在这里
会话。put(“orgs”,orgs);
session.put(“currentOrg”,org);
session.put(“权限”,adminao.getRolePermission(orgs.get(0.getRoleId()));
会议.付诸表决(“simplyApp”,simplyApp);
session.put(“用户”,user);
返回“登录”
}
}
2) 正在使用的操作系统是windows 2008 RC2

EDIT2接收器代码

拦截器1

publicstringintercept(ActionInvocation调用)引发异常
{
字符串结果=null;
字符串className=invocation.getAction().getClass().getName();
映射会话=invocation.getInvocationContext().getSession();
IRUser=(IRUser)session.get(“用户”);
IROrgname org=(IROrgname)session.get(“currentOrg”);
IRAppDetails simplyApp=(IRAppDetails)session.get(“simplyApp”);
String sessionId=(String)session.get(“sessionId”);
boolean switchUser=session.get(“switchUser”)!=null?(boolean)session.get(“switchUser”):false;
if(className.indexOf(“IRLoginAction”)!=-1 | | className.indexOf(“IRContactUsAction”)!=-1
||className.indexOf(“IRIPNAction”)!=-1 | | className.indexOf(“IRPaymentAction”)!=-1
||className.indexOf(“IRServiceAction”)!=-1 | | className.indexOf(“IRAppBossAction”)!=-1)
{
结果=invocation.invoke();
session.put(“PREV_CLASS_NAME”,className);
}
else if(!(className.indexOf(“IRLoginAction”)!=-1)和&(user!=null&&org!=null))
{
如果(!IRSessionManager.getInstance().CompareseSession(user.getUserId(),sessionId)&&!switchUser)
{
session.clear();
if(org.apache.struts2.dispatcher.SessionMap的会话实例)
{
尝试
{
((org.apache.struts2.dispatcher.SessionMap)会话);
}
捕获(非法状态)
{
日志错误(“会话失效失败”,e);
}
}
结果=“sessionDuplicated”;
}
其他的
{
结果=invocation.invoke();
session.put(“PREV_CLASS_NAME”,className);
}
}
else if(className.indexOf(“小部件”)!=-1)
{
结果=invocation.invoke();
}
else if(className.indexOf(“ActionSupport”)!=-1)
{
结果=invocation.invoke();
}
else if(!(className.indexOf(“IRLoginAction”)!=-1)和&(user==null | | org==null | | simplyApp==null))
{
结果=“sessionExpired”;
}
返回结果;
}
拦截器2

publicstringintercept(ActionInvocation调用)引发异常
{
字符串结果=null;
HttpServletRequest=ServletActionContext.getRequest();
字符串className=invocation.getAction().getClass().getName();
尝试
{
映射会话=invocation.getInvocationContext().getSession();
IRUser=(IRUser)session.get(“用户”);
IROrgname org=(IROrgname)session.get(“currentOrg”);
IRAppDetails应用程序=(IRAppDetails)session.get(“simplyApp”);
if((user!=null&&user.getAppType()!=0)&&&!(className.indexOf(“IRLoginAction”)!=-1))
{
if(hasAccess(user.getAppType(),className))
{
结果=invocation.invoke();
}
其他的
{
result=“checkURL”;
}
}
其他的
{
结果=invocation.invoke();
}
}
捕获(例外e)
{
e、 printStackTrace();
}
返回结果;
}

我两天前在一个遗留项目(不是我的)上调试了类似的东西

事实证明,这是自定义拦截器的错

检查我在你的堆栈中看到的自定义拦截器


确保他们的鳕鱼