两天前,我在一个旧项目(不是我的)上调试了类似的东西。
原来这是自定义拦截器的错误。
检查我可以在您的堆栈中看到的自定义拦截器,
<interceptor-ref name="sessionLoggin"/> <interceptor-ref name="appAccess"/>
并确保其代码是线程安全的(避免使用拦截器上的字段,而不是同步所有内容,仅使用局部变量)。
例如,考虑以下代码:
public abstract class ThreadUnsafeInterceptor extends AbstractInterceptor { private Map<String, Object> session; // <!-- Thread Unsafe public final String intercept(ActionInvocation invocation) throws Exception { session = invocation.getInvocationContext().getSession(); System.out.println(session.get("myObject")); return invocation.invoke(); }}
这样,当User1进入方法时,它会设置共享
session对象及其会话。如果在User1尚未完成的情况下User2进入该方法,则User2将立即
session用其会话覆盖该对象,而User1将引用User2会话而不是它自己的会话。
要使其线程安全,应如下所示:
public abstract class ThreadSafeInterceptor extends AbstractInterceptor { public final String intercept(ActionInvocation invocation) throws Exception { Map<String, Object> session; // <!-- Thread Safe session = invocation.getInvocationContext().getSession(); System.out.println(session.get("myObject")); return invocation.invoke(); }}
编辑:
您的拦截器存在一些问题:
1)请求不能被访问这种方式(如描述这里):
HttpServletRequest request = ServletActionContext.getRequest();
从Struts2拦截器内部访问请求的正确方法是:
// Constants are from StrutsStatics interfaceHttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
2)如果您不想
invocation.invoke();立即返回立即数,请注意,将其分配给
resultString将触发“流”,并且
invoke()将在Action执行之后执行后面的行,如下所述:
public String intercept(ActionInvocation invocation) throws Exception { String className = invocation.getAction().getClass().getName(); long startTime = System.currentTimeMillis(); System.out.println("Before calling action: " + className); String result = invocation.invoke(); long endTime = System.currentTimeMillis(); System.out.println("After calling action: " + className + " Time taken: " + (endTime - startTime) + " ms"); return result;}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)