【发布时间】:2013-11-03 17:46:22
【问题描述】:
似乎如果我对同一个操作(例如 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 或其他数据集。这可能会导致不同的用户被授予访问彼此数据的权限。
我在所有这些方面都是正确的吗?如果是这样,是否有解决此问题的方法?因为这似乎完全违背了拦截器的目的。
【问题讨论】: