Hi Patrick, On Thu, Apr 4, 2019 at 10:16 AM Patrick Schwarzer < patrick.schwar...@tomtec.de> wrote:
> Hi Sven, > > > > thanks for the reply. > > > > The problem is, that at the end of the request in onDetach wicket tries to > write content of pages into the session (see storeTouchedPages in > Stack-Trace), which is already dead. To identify if wicket needs to store > content into session, it checked the Session.get() / > ThreadContext.getSession() cached Session, which represents not the real > last state of the session. > > > > When wicket then writes content into session, it look in the real dead > session (getSessionStore().getAttribute call). > I have the feeling there is some problem with Shiro here. What exactly is a "dead" session ?! Wicket uses HttpServletRequest#getSession(boolean) to get the underlying HttpSession. Depending on the value of the boolean parameter the Servlet container should: - if the parameter is 'false' then: -- if there is a session then it should return it -- if there is a no session then it should return null - if the value is 'true' then: -- if there is a session then it should return it -- if there is a no session then it should create a *new* HttpSession and return it So, I do not understand what Shiro considers as "dead" session. > > So I don’t know the right solution but I could not understand why checking > state of session is done on a cached version while writing than is done on > the real one. Does the process not to be consistent (check and write in the > cached or check and write in the real one)? > Wicket stores the Wicket Session into a ThreadLocal, i.e. caches it. But any access to the HttpSession is via HttpSessionStore which uses the Servlet APIs. The Wicket Session itself is stored as an attribute in the HttpSession. > > > Kind regards > > > > > > *PATRICK SCHWARZER* > SOFTWARE ENGINEER > > *o* +49 89 32175 655 > > *TOMTEC Imaging Systems GmbH* > Edisonstrasse 6, 85716 Unterschleissheim, Germany, Managing Director: > Johannes Waldinger, Dr. Thomas Piehler, HRB 235646 Amtsgericht Muenchen > > <http://www.tomtec.de/> > > > > > > > > Hi Patrick, > > > > Wicket uses a temporary session if there's no container session, e.g. > > the latter has already expired. > > It's not clear to me why that's a problem for you. > > > > Best regards > > Sven > > > > > *Von:* Patrick Schwarzer > *Gesendet:* Mittwoch, 3. April 2019 13:27 > *An:* 'users@wicket.apache.org' <users@wicket.apache.org> > *Betreff:* Problem with ThreadContext.getSession when session dies > > > > Dear Sir or Madam, > > we identified an issue during request handling in Wicket 7.12.0 when > session dies during processing. > > The problem is, that parts of the code accessing current session by > calling Session.get() which then return a valid session cached in > ThreadContext.getSession(). > > But when accessing an attribute of the Session, the code accesses the real > session, which is dead and leads to an Exception. > > So we were a little confused why Session.get() and Session.exists() return > valid results when Session is already dead. > How we can avoid Session.get() and Session.exists() return valid results? > Alternatively how we can ensure, that Request with cached Session is > handled correctly? > > > > > > The stack trace of our problem: > > java.lang.IllegalStateException: > org.apache.shiro.session.UnknownSessionException: There is no session with > id [48cf6f39-9bf6-4b76-84cd-a106e707af63] > > at > org.apache.shiro.web.servlet.ShiroHttpSession.getAttribute(ShiroHttpSession.java:133) > ~[shiro-web-1.3.2.jar:1.3.2] > > getAttribute:286, HttpSessionStore (org.apache.wicket.session) > > getAttribute:743, Session (org.apache.wicket) *<< Why this is not > accessing cached Session?* > > getSessionAttribute:66, DefaultPageManagerContext (org.apache.wicket.page) > > getSessionAttribute:101, RequestAdapter (org.apache.wicket.page) > > getSessionEntry:414, PageStoreManager$PersistentRequestAdapter > (org.apache.wicket.page) > > storeTouchedPages:438, PageStoreManager$PersistentRequestAdapter > (org.apache.wicket.page) *<< Should this happen, when Session is already > dead?* > > commitRequest:193, RequestAdapter (org.apache.wicket.page) > > commitRequest:76, AbstractPageManager (org.apache.wicket.page) > > commitRequest:74, PageManagerDecorator (org.apache.wicket.page) > > commitRequest:270, PageAccessSynchronizer$2 (org.apache.wicket.page) > > onDetach:1798, Application$3 (org.apache.wicket) > > notify:105, RequestCycleListenerCollection$3 > (org.apache.wicket.request.cycle) > > notify:101, RequestCycleListenerCollection$3 > (org.apache.wicket.request.cycle) > > notify:120, ListenerCollection$1 (org.apache.wicket.util.listener) > > reversedNotify:144, ListenerCollection (org.apache.wicket.util.listener) > > reversedNotifyIgnoringExceptions:113, ListenerCollection > (org.apache.wicket.util.listener) > > onDetach:100, RequestCycleListenerCollection > (org.apache.wicket.request.cycle) > > onDetach:649, RequestCycle (org.apache.wicket.request.cycle) > > detach:594, RequestCycle (org.apache.wicket.request.cycle) > > processRequestAndDetach:297, RequestCycle (org.apache.wicket.request.cycle) > > processRequestCycle:261, WicketFilter (org.apache.wicket.protocol.http) > > processRequest:203, WicketFilter (org.apache.wicket.protocol.http) > > doFilter:284, WicketFilter (org.apache.wicket.protocol.http) > > internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core) > > doFilter:166, ApplicationFilterChain (org.apache.catalina.core) > > doFilterInternal:99, RequestContextFilter (org.springframework.web.filter) > > doFilter:107, OncePerRequestFilter (org.springframework.web.filter) > > internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core) > > doFilter:166, ApplicationFilterChain (org.apache.catalina.core) > > doFilter:61, ProxiedFilterChain (org.apache.shiro.web.servlet) > > executeChain:108, AdviceFilter (org.apache.shiro.web.servlet) > > doFilterInternal:137, AdviceFilter (org.apache.shiro.web.servlet) > > doFilter:125, OncePerRequestFilter (org.apache.shiro.web.servlet) > > doFilter:66, ProxiedFilterChain (org.apache.shiro.web.servlet) > > executeChain:108, AdviceFilter (org.apache.shiro.web.servlet) > > doFilterInternal:137, AdviceFilter (org.apache.shiro.web.servlet) > > doFilter:125, OncePerRequestFilter (org.apache.shiro.web.servlet) > > doFilter:66, ProxiedFilterChain (org.apache.shiro.web.servlet) > > executeChain:449, AbstractShiroFilter (org.apache.shiro.web.servlet) > > call:365, AbstractShiroFilter$1 (org.apache.shiro.web.servlet) > > doCall:90, SubjectCallable (org.apache.shiro.subject.support) > > call:83, SubjectCallable (org.apache.shiro.subject.support) > > execute:383, DelegatingSubject (org.apache.shiro.subject.support) > > doFilterInternal:362, AbstractShiroFilter (org.apache.shiro.web.servlet) > > doFilter:125, OncePerRequestFilter (org.apache.shiro.web.servlet) > > invokeDelegate:357, DelegatingFilterProxy (org.springframework.web.filter) > > doFilter:270, DelegatingFilterProxy (org.springframework.web.filter) > > internalDoFilter:193, ApplicationFilterChain (org.apache.catalina.core) > > doFilter:166, ApplicationFilterChain (org.apache.catalina.core) > > invoke:198, StandardWrapperValve (org.apache.catalina.core) > > invoke:96, StandardContextValve (org.apache.catalina.core) > > invoke:478, AuthenticatorBase (org.apache.catalina.authenticator) > > invoke:140, StandardHostValve (org.apache.catalina.core) > > invoke:80, ErrorReportValve (org.apache.catalina.valves) > > invoke:650, AbstractAccessLogValve (org.apache.catalina.valves) > > invoke:279, RewriteValve (org.apache.catalina.valves.rewrite) > > invoke:677, RemoteIpValve (org.apache.catalina.valves) > > invoke:87, StandardEngineValve (org.apache.catalina.core) > > service:342, CoyoteAdapter (org.apache.catalina.connector) > > service:799, Http11Processor (org.apache.coyote.http11) > > process:66, AbstractProcessorLight (org.apache.coyote) > > process:868, AbstractProtocol$ConnectionHandler (org.apache.coyote) > > doRun:1457, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net) > > run:49, SocketProcessorBase (org.apache.tomcat.util.net) > > runWorker:1149, ThreadPoolExecutor (java.util.concurrent) > > run:624, ThreadPoolExecutor$Worker (java.util.concurrent) > > run:61, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads) > > run:748, Thread (java.lang) > > Kind regards > > > > *PATRICK SCHWARZER* > SOFTWARE ENGINEER > > *o* +49 89 32175 655 > > *TOMTEC Imaging Systems GmbH* > Edisonstrasse 6, 85716 Unterschleissheim, Germany, Managing Director: > Johannes Waldinger, Dr. Thomas Piehler, HRB 235646 Amtsgericht Muenchen > > <http://www.tomtec.de/> > > >