Martin Cassidy created WICKET-6126:
--------------------------------------

             Summary: ThreadContext in WicketFilter init()
                 Key: WICKET-6126
                 URL: https://issues.apache.org/jira/browse/WICKET-6126
             Project: Wicket
          Issue Type: Bug
          Components: wicket
            Reporter: Martin Cassidy
            Priority: Minor


I'm combing Wicket, wicket stuff portlets and Apache Pluto to create 
portal/portlet application.

Some portlets exist within the same context and the portal application, which 
means the I have 2 wicket filters and 2 wicket applications running in the same 
context.

The standard wicket filter serves the portal requests and matches /* patterns, 
the PortletFilter from wicketstuff matches /PlutoInvoker/*

Each filter uses a different application class (I did try using just one 
application and one filter but this didn't work because of what PortletFilter 
does the the application it's attached to)

I'm not sure about other servlet containers, but at least on undertow with 
Wildfly 10, filters are not initialised until the first time that they called 
upon to process a requires.

Whilst the WicketFilter doFilter() method can handle multple invocations per 
request by saving and restoring the ThreadContext, the ini() does not do this 
which means for the first request to the application the invocation order is:

# WicketFilter.init()
# WicketFilter.doFilter()
# PortletFilter.init()
# PortletFilter.doFilter()

Which causes the following:

{code}
14:49:03,986 ERROR [io.undertow.request] (default task-13) UT005023: Exception 
handling request to /: javax.servlet.ServletException: Filtered request failed.
        at 
org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:384)
        at 
org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
        at 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
        at 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
        at 
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
        at 
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at 
io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
        at 
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
        at 
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
        at 
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at 
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
        at 
io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at 
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
        at 
io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
        at 
io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
        at 
io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
        at 
io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
        at 
io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at 
org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at 
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284)
        at 
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263)
        at 
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
        at 
io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174)
        at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
        at 
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.wicket.WicketRuntimeException: There is no application 
attached to current thread default task-13
        at org.apache.wicket.Application.get(Application.java:236)
        at org.apache.wicket.Session.exists(Session.java:144)
        at 
org.apache.wicket.request.cycle.RequestCycle.onInternalDetach(RequestCycle.java:611)
        at 
org.apache.wicket.request.cycle.RequestCycle.detach(RequestCycle.java:600)
        at 
org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:297)
        at 
org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)
        at 
org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203)
        at 
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:284)
        at 
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
        at 
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at 
org.apache.pluto.driver.PortalDriverFilter.doFilter(PortalDriverFilter.java:130)
        at 
io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
        at 
io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at 
org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
        at 
org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
        at 
org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
        at 
org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
        at 
org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
        at 
org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
        ... 32 more
{code}

The 2nd and any subsequent requests are fine, as the init()s have run and 
doFilter() handles the ThreadContext correctly.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to