[undertow-dev] Sharing session attributes in NonBlocking Handlers and Traditional Servlets
Lightspoke Discussion
lsgroup at gmail.com
Tue Mar 11 13:02:45 EDT 2014
Hi Stuart,
It worked! I was able to get the servletcontext and then pass it into the
handler as you suggested. Like this:
================================
public class NonBlockingHandlerExtension implements ServletExtension {
@Override
public void handleDeployment(DeploymentInfo deploymentInfo,
ServletContext servletContext) {
final ServletContextImpl srvctx = (ServletContextImpl)
servletContext;
System.out.println("\n\n\n ... \n\n\n srvctx="+srvctx);
//returns non-null object
deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() {
@Override
public HttpHandler wrap(final HttpHandler handler) {
HelloWorldHandler hwhandler = new HelloWorldHandler();
hwhandler.setServletContext(srvctx);
return new PathHandler()
.addExactPath("/hello", hwhandler)
.addPrefixPath("/", handler);
}
});
}
}
then the handler:
public class HelloWorldHandler implements HttpHandler {
public ServletContextImpl srvctx;
public void setServletContext(ServletContextImpl _srvctx) {
srvctx = _srvctx;
}
@Override
public void handleRequest(final HttpServerExchange exchange) throws
Exception {
HttpSessionImpl sessionimpl;
sessionimpl = srvctx.getSession(exchange, true);
System.out.println("sessionimpl(exchange)="+sessionimpl);
System.out.println("1. PRE session get
coffee="+sessionimpl.getAttribute("coffee"));
sessionimpl.setAttribute("coffee", "Stumptown");
System.out.println("1. POST session get
coffee="+sessionimpl.getAttribute("coffee"));
================================
My only concern now is with thread safety and synchronization.
Will instantiating a new handler and then passing the servlet context via a
public set method be thread safe? Will it introduce any kind of
synchronization contention?
And is there a "better" way of passing that servlet context into the
handler?
Also, if it has been there this whole time, how come
ServletRequestContext reqctx =
exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY);
inside the handleRequest method does not work?
Thanks!
On Mon, Mar 10, 2014 at 1:37 PM, Stuart Douglas <sdouglas at redhat.com> wrote:
> Yes, if you are running handlers outside the servlet chain the servlet
> request context does not get setup.
>
> Because you are actually after the ServletContextImpl (which allows you to
> get the session) you need to get a reference to this at deployment time.
>
> How are you setting up your non-blocking handler? Via ServletExtension?
>
> If so then the ServletContext is just passed into the extension, so you
> can just pass it directly to the handler (You will need to cast it to
> ServletContextImpl though in order to use it to get the session).
>
> Stuart
>
> Lightspoke Discussion wrote:
>
>> Hi Stuart,
>>
>> I have a regular servlet (the sample... public class HelloWorldServlet
>> extends HttpServlet) running inside the same web context (in the same
>> war). In the HelloWorldServlet I can access the session object. I ran
>> that first, but when I run the non-blocking servlet, my reqctx still
>> returns null.
>>
>> I'm running Wildfly 8.0.0 final, in case that matters.
>>
>> So is everything hinging on:
>>
>>
>> public class ServletInitialHandler implements HttpHandler,
>> ServletDispatcher {
>>
>> ...
>> publicvoidhandleRequest(finalHttpServerExchangeexchang
>> e)throwsIOException,ServletException
>> ...
>>
>> exchange.putAttachment(ServletRequestContext.ATTACHMENT_KEY,
>> servletRequestContext);
>>
>> ...
>>
>>
>>
>>
>>
>> On Sun, Mar 9, 2014 at 12:55 PM, Stuart Douglas <sdouglas at redhat.com
>> <mailto:sdouglas at redhat.com>> wrote:
>>
>> This will only be not null after the first servlet handler has run.
>> If your handler is executing outside the scope of the servlet
>> deployment then you need to store a reference to the ServletContext
>> somewhere (worst case = stick it in a static somewhere).
>> Stuart
>>
>>
>> Lightspoke Discussion wrote:
>>
>> If you are running before the initial handler you need to store
>> a reference to the servlet context or the Deployment somewhere.
>>
>>
>>
>>
>> --
>> --
>> Matthew Ma
>> http://www.lightspoke.com
>> Lightspoke Web Based Database
>>
>
--
--
Matthew Ma
http://www.lightspoke.com
Lightspoke Web Based Database
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20140311/902e0490/attachment.html
More information about the undertow-dev
mailing list