似乎如果我对同一个操作(例如 mysite.com/fooAction)有两个并发请求,那么 struts 会重置第一个操作的实例,而该实例可能仍在拦截器中。
例如,如果我的拦截器中有以下代码:
action = ai.getAction();
String result = ai.invoke();
logger.debug("Orig action : " + action.toString() +" , now : " + ai.getAction().toString() );
如果我对同一个操作发出两个并发请求(例如使用 javascript),那么该行:
logger.debug("Orig action : " + action.toString() +" , now : " + ai.getAction().toString() );
产生两个不同toString()
的代码,表明原始动作与最后一个动作在不同的实例中。
这是一个大问题,因为现在,如果我在拦截器中有任何代码,它会在我的操作上设置某些东西,例如执行以下操作:
MyAction action = (MyAction) ai.getAction();
Auth auth = new Auth ( action.getSession() );
action.setAuth(auth);
action.setCookiesMap( Util.getAllCookies() );
String result = ai.invoke();
那么就不能保证我在操作中设置的所有这些东西实际上都会传递给正确的实例。即,当ai.invoke()
被调用时,它实际上可能调用了一个完全不同的动作实例,该实例上有不同的 cookie 或其他数据集。这可能导致不同的用户被授予访问彼此数据的权限。
我在这一切中都是正确的吗?如果是这样,是否有解决此问题的方法?因为这似乎完全违背了拦截器的目的。