[ 
https://issues.apache.org/struts/browse/WW-2902?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=45109#action_45109
 ] 

Sitaram Reddy commented on WW-2902:
-----------------------------------

This issue should be reopened. The above resolution fixes this specific issue 
but does not address the root cause. I notice 
ExecuteAndWaitInterceptor.doIntercept(...) also uses this object ( = 
ActionContext.getContext().getSession() ) to synchronize a block of code. There 
may be others still doing the same. 

It seems to me the root cause of this problem is the assumption that 
ActionContext.getContext().getSession() is an object of SESSION scope. That 
would be a natural assumption. After all, it is a substitute for the 
HttpSession object which has SESSION scope. That a 'getSession()' method would 
return a 'Session' kind of an object that would be of SESSION scope makes 
sense. Developers have implicitly assumed this, and have often times used the 
variabale name 'session' for this object. And, apparently, they have been using 
this object to synchronize threads across a SESSION. It would involve a lot 
more work, but I believe the correct fix for this issue is to have 
ActionContext.getContext().getSession() return an object that has SESSION scope.

> Session token usage error: java.lang.IllegalStateException: Context has not 
> been prepared for next connection
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: WW-2902
>                 URL: https://issues.apache.org/struts/browse/WW-2902
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Core Interceptors
>    Affects Versions: 2.1.2
>            Reporter: Sitaram Reddy
>             Fix For: 2.1.3
>
>
> I have looked into the source code and found the reason. In 
> TokenInterceptor.doIntercept(...), there is this code:
>               Map session = ActionContext.getContext().getSession();
>               synchronized (session) {
>                       if (!TokenHelper.validToken()) {
>                               return handleInvalidToken(invocation);
>                       }
>                       return handleValidToken(invocation);
>               }
> This block is essentially not synchronized! I found that the session Map is 
> not a unique object across requests within an user session - in contrast with 
> the HttpSession object provided by the Servlet API. Perhaps that should be 
> considered the real bug?  
> A previous bug WW-1786 also points out that the above block is not 
> synchronized - that fix would be redundant once this issue is resolved.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to