Note that there are some explanatory texts on larger screens.

plurals
  1. POUser session getting mixed up on tomcat
    primarykey
    data
    text
    <p>We are using Tomcat 6.29 behind IIS7.5, with spring, hibernate and struts2 framework. We are now beginning to notice that the server sessions are getting mixed up especially in Ajax request. </p> <p>More details about the problem</p> <ul> <li>User 1 requests page1, user 2 request page2. But user1 gets served page2 and user2 gets server page1.</li> <li>The session ids are also changing, but on refreshing the page, the correct page is served up.</li> <li>The problem seems to be happening more often when the number of users are high.</li> </ul> <p>Any pointers to the origin of the problem would help, the code runs fine with lesser number of users and no such instance is reported.</p> <p>EDIT</p> <p><strong>web.xml</strong></p> <pre class="lang-xml prettyprint-override"><code>&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"&gt; &lt;display-name&gt;bm&lt;/display-name&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;classpath:spring/*Context.xml&lt;/param-value&gt; &lt;/context-param&gt; &lt;filter&gt; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;param-name&gt;encoding&lt;/param-name&gt; &lt;param-value&gt;UTF-8&lt;/param-value&gt; &lt;/init-param&gt; &lt;init-param&gt; &lt;param-name&gt;forceEncoding&lt;/param-name&gt; &lt;param-value&gt;true&lt;/param-value&gt; &lt;/init-param&gt; &lt;/filter&gt; &lt;filter&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; &lt;listener&gt; &lt;listener-class&gt;org.apache.struts2.tiles.StrutsTilesListener&lt;/listener-class&gt; &lt;/listener&gt; </code></pre> <p><strong>struts.xml</strong></p> <pre class="lang-xml prettyprint-override"><code>&lt;result-types&gt; &lt;result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/&gt; &lt;result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /&gt; &lt;/result-types&gt; &lt;interceptors&gt; &lt;interceptor name="sessionLoggin" class="com.inrev.bm.interceptor.IRLoggingInterceptor" /&gt; &lt;interceptor name="appAccess" class="appAccessInterceptor" /&gt; &lt;interceptor-stack name="newStack"&gt; &lt;interceptor-ref name="exception"/&gt; &lt;interceptor-ref name="alias"/&gt; &lt;interceptor-ref name="servletConfig"/&gt; &lt;interceptor-ref name="i18n"/&gt; &lt;interceptor-ref name="prepare"/&gt; &lt;interceptor-ref name="chain"/&gt; &lt;interceptor-ref name="debugging"/&gt; &lt;interceptor-ref name="scopedModelDriven"/&gt; &lt;interceptor-ref name="modelDriven"/&gt; &lt;interceptor-ref name="fileUpload"/&gt; &lt;interceptor-ref name="checkbox"/&gt; &lt;interceptor-ref name="multiselect"/&gt; &lt;interceptor-ref name="staticParams"/&gt; &lt;interceptor-ref name="params"&gt; &lt;param name="excludeParams"&gt; dojo\..*,^struts\..*&lt;/param&gt; &lt;/interceptor-ref&gt; &lt;interceptor-ref name="actionMappingParams"/&gt; &lt;interceptor-ref name="sessionLoggin"/&gt; &lt;interceptor-ref name="appAccess"/&gt; &lt;/interceptor-stack&gt; &lt;/interceptors&gt; &lt;default-interceptor-ref name="newStack"/&gt; </code></pre> <p><strong>Other Information</strong></p> <p>1) Users are login in by submitting a form, on login we perform the following,</p> <pre class="lang-java prettyprint-override"><code>public class xxxAction extends ActionSupport implements SessionAware { public String execute() { session.clear(); if (session instanceof org.apache.struts2.dispatcher.SessionMap) { try { ((org.apache.struts2.dispatcher.SessionMap) session).invalidate(); } catch (IllegalStateException e) { log.error("Session Invalidate Failed ", e); } //Authorization code happens here session.put("orgs", orgs); session.put("currentOrg", org); session.put("permission", adminDAO.getRolePermission(orgs.get(0).getRoleId())); session.put("simplyApp", simplyApp); session.put("user", user); return "login" } } </code></pre> <p>2) Os being used is windows 2008 RC2</p> <p><strong>EDIT2</strong> INCEPTOR CODE</p> <p>INTERCEPTOR 1</p> <pre class="lang-java prettyprint-override"><code>public String intercept(ActionInvocation invocation) throws Exception { String result = null; String className = invocation.getAction().getClass().getName(); Map session = invocation.getInvocationContext().getSession(); IRUser user = (IRUser) session.get("user"); 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) { result= invocation.invoke(); session.put("PREV_CLASS_NAME", className); } else if(!(className.indexOf("IRLoginAction")!=-1) &amp;&amp; (user !=null &amp;&amp; org!=null)) { if(!IRSessionManager.getInstance().compareSession(user.getUserId(), sessionId) &amp;&amp; !switchUser) { session.clear(); if (session instanceof org.apache.struts2.dispatcher.SessionMap) { try { ((org.apache.struts2.dispatcher.SessionMap) session).invalidate(); } catch (IllegalStateException e) { log.error("Session Invalidate Failed ", e); } } result = "sessionDuplicated"; } else { result= invocation.invoke(); session.put("PREV_CLASS_NAME", className); } } else if(className.indexOf("widgets") !=-1) { result= invocation.invoke(); } else if(className.indexOf("ActionSupport") !=-1) { result= invocation.invoke(); } else if (!(className.indexOf("IRLoginAction")!=-1) &amp;&amp; (user ==null || org==null || simplyApp==null)) { result = "sessionExpired"; } return result; } </code></pre> <p><strong>INTERCEPTOR 2</strong></p> <pre class="lang-java prettyprint-override"><code> public String intercept(ActionInvocation invocation) throws Exception { String result = null; HttpServletRequest request = ServletActionContext.getRequest(); String className = invocation.getAction().getClass().getName(); try { Map session = invocation.getInvocationContext().getSession(); IRUser user = (IRUser) session.get("user"); IROrgname org = (IROrgname)session.get("currentOrg"); IRAppDetails application = (IRAppDetails)session.get("simplyApp"); if(( user!= null &amp;&amp; user.getAppType()!=0) &amp;&amp; !(className.indexOf("IRLoginAction")!=-1)) { if(hasAccess(user.getAppType(), className)) { result= invocation.invoke(); } else { result = "checkURL"; } } else { result= invocation.invoke(); } } catch (Exception e) { e.printStackTrace(); } return result; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload