What spirit are you referring to?
If you are talking about the javadoc bit you quoted earlier, it simply says
that if you implement the *createSession *method, you must make sure to
first search for an existing *sessionId *in the exchange and use it in case
you find it. This is achieved by calling the *findSessionId *method on the
SessionConfig object.
This is exactly what is done in the redis example I sent earlier (
master/src/main/java/com/pedanticprogrammer/undertow/
RedisSessionManager.java line 69):
String sessionId = sessionConfig.findSessionId(serverExchange);
So to summarize, what you need to do:
- Create a Redis based session manager (following the above example)
- Set it up in your servlet Deployment via a *SessionManagerFactory*.
You do not even have to care about a *SessionConfig*.
Since you are using the servlet api with undertow, a *SessionCookieConfigImpl
*(it implements *SessionConfig*) will be created automatically for you when
the *ServletContext *is created.
That's it!
Cheers,
Antoine
On Wed, Mar 29, 2017 at 8:04 PM, Eric B <ebenzacar(a)gmail.com> wrote:
Agreed, but what calls that createSession() method?
From what I can tell looking at the code, it's the ioundertow.servlet.spec.
ServletContextImpl.getSession(ServletContextImpl, HttpServerExchange,
boolean) which calls the createSession() method, getting the SessionConfig
object from the SessionCookieConfig object, which is instantiated in the
constructor:
public ServletContextImpl(final ServletContainer servletContainer,
final Deployment deployment) {
this.servletContainer = servletContainer;
this.deployment = deployment;
this.deploymentInfo = deployment.getDeploymentInfo();
* sessionCookieConfig = new SessionCookieConfigImpl(this);*
sessionCookieConfig.setPath(deploymentInfo.getContextPath());
...
...
}
public HttpSessionImpl getSession(final ServletContextImpl
originalServletContext, final HttpServerExchange exchange, boolean create) {
SessionConfig c = originalServletContext.getSessionConfig();
...
...
...
...
final Session newSession = sessionManager.createSession(exchange,
c);
httpSession = SecurityActions.forSession(newSession,
this, true);
exchange.putAttachment(sessionAttachmentKey, httpSession);
}
}
return httpSession;
}
So like I said, I can override the behaviour, but then I am not adhering
to the spirit of the Manager which specifies that it must defer calls to
the SessionConfig object.
Thanks,
Eric
On Wed, Mar 29, 2017 at 10:05 AM, Antoine Girard <antoine.girard(a)ymail.com
> wrote:
> The SessionManager#createSession() method takes a SessionConfig as second
> argument.
> I don't understand what more do you need!
>
> Cheers,
> Antoine
>
> On Wed, Mar 29, 2017 at 3:55 PM, Eric B <ebenzacar(a)gmail.com> wrote:
>
>> I'm not actually trying to reusue the SessionCookieConfigImpl. But in
>> the SessionManager javadoc, it clearly states that:
>>
>> * As part of session creation the session manager MUST attempt to
>> retrieve the {@link SessionCookieConfig} from
>> * the {@link HttpServerExchange} and use it to set the session cookie.
>> The frees up the session manager from
>> * needing to know details of the cookie configuration. When
>> invalidating a session the session manager MUST
>> * also use this to clear the session cookie.
>>
>> So while I can create my own SessionManager that completely ignores the
>> SessionConfig object, as per the SessionManager javadocs, the manager must
>> attempt to retrieve the SessionConfig object from the exchange to set the
>> session cookie. I am just trying to fulfill the SessionManager
>> requirements.
>>
>> But there is missing documentation indicating how/where one can specify
>> the SessionCookieConfig implementation that I want undertow to use. I
>> would like undertow to use my own custom implementation.
>>
>> Thanks,
>>
>> Eric
>>
>>
>> On Mar 29, 2017 9:35 AM, "Bill O'Neil" <bill(a)dartalley.com>
wrote:
>>
>>> What exactly will you gain from reusing SessionConfig if you are going
>>> to hack around a lot of it? If not much then just write your own handler
>>> that handles the cookies and talking to Redis it might be less work then
>>> customizing and hacking around SessionConfig.
>>>
>>> On Wed, Mar 29, 2017 at 9:01 AM, Eric B <ebenzacar(a)gmail.com> wrote:
>>>
>>>> Agreed, but I want to use my own SessionConfig implementation in which
>>>> the Sessionid is stored in a different cookie structure then the default
>>>> implementation.
>>>>
>>>> I was looking for something that allows me to specify the
>>>> SessionConfig implementation I want undertow to use, but can't find
that
>>>> config option anywhere.
>>>>
>>>> Thanks,
>>>>
>>>> Eric
>>>>
>>>> On Mar 29, 2017 8:44 AM, "Antoine Girard"
<antoine.girard(a)ymail.com>
>>>> wrote:
>>>>
>>>> A SessionConfig is just an interface for the SessionManager to
>>>> retrieve the session ID.
>>>> You do want to store session IDs in cookies, is that correct?
>>>> In that case, simply use the default SessionCookieConfig:
>>>>
https://github.com/undertow-io/undertow/blob/master/core/src
>>>> /main/java/io/undertow/server/session/SessionCookieConfig.java
>>>>
>>>> Cheers,
>>>> Antoine
>>>>
>>>>
>>>> On Wed, Mar 29, 2017 at 2:19 PM, Eric B <ebenzacar(a)gmail.com>
wrote:
>>>>
>>>>> Thanks for the link; that is definitely going to be a big help for
>>>>> the redis bridge.
>>>>>
>>>>> But I'm still unclear as to the "right" way to
use/define my own
>>>>> SessionConfig implementation. In the link you sent, they instantiate
the
>>>>> RedisManager with the existing SessionConfig object, and use
whatever
>>>>> undertow passes in the parameters.
>>>>>
>>>>> As I mentioned in my earlier post, I suspect I can hack around it
>>>>> using the SessionConfigWrapper but that does not seem to respect the
spirit
>>>>> or intent of the wrapper, so I'm trying to figure out if there
is
>>>>> another/better way to do this.
>>>>>
>>>>> Or is the only solution to completely ignore the SessionConfig
object
>>>>> and build my solution independent of it? But then it will not respect
the
>>>>> contract of the SessionManager to retrieve the Sessionid from the SC
object
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Eric
>>>>>
>>>>> On Mar 29, 2017 8:00 AM, "Antoine Girard"
<antoine.girard(a)ymail.com>
>>>>> wrote:
>>>>>
>>>>> Hi Eric,
>>>>>
>>>>> Unfortunately I cannot share that code as it's company property.
>>>>> As far as I can remember, it was really easy. I used the java redis
>>>>> library: Jedis
>>>>> Oh, and look what I found:
>>>>>
https://github.com/coat/undertow-redis-session/blob/master/s
>>>>>
rc/main/java/com/pedanticprogrammer/undertow/RedisSessionManager.java
>>>>>
>>>>> That's a good starting point, if not the complete solution right
>>>>> there.
>>>>>
>>>>> Cheers,
>>>>> Antoine
>>>>>
>>>>> On Wed, Mar 29, 2017 at 1:48 PM, Eric B <ebenzacar(a)gmail.com>
wrote:
>>>>>
>>>>>> Antoine,
>>>>>>
>>>>>> That's exactly where I am heading too. Is there any chance
you
>>>>>> still have our can share the code you used to do that?
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Eric
>>>>>>
>>>>>> On Mar 29, 2017 7:24 AM, "Antoine Girard"
<antoine.girard@ymailcom
>>>>>> <antoine.girard(a)ymail.com>> wrote:
>>>>>>
>>>>>>> I did a similar thing once: persisting sessions into a Redis
data
>>>>>>> store
>>>>>>> My starting point was the InMemorySessionManager.
>>>>>>>
>>>>>>> Good luck to you!
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Antoine
>>>>>>>
>>>>>>> On Wed, Mar 29, 2017 at 1:09 PM, Eric B
<ebenzacar(a)gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> From my understanding, I was thinking/planning to create
my own
>>>>>>>> SessionManager to handle the Session loading. And from
the docs, it
>>>>>>>> indicates that the SessionManager must delegate
retrieving the sessionId to
>>>>>>>> the SessionConfig object
>>>>>>>>
>>>>>>>> Am I heading down the wrong path? Is there an
easier/another way
>>>>>>>> to load/persist the session?
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>>
>>>>>>>> Eric
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Mar 29, 2017 7:01 AM, "Bill O'Neil"
<bill@dartalleycom> wrote:
>>>>>>>>
>>>>>>>> If you want such a custom solution why not just use a
cookie and
>>>>>>>> ignore all of the SessionConfig code. You can write a
handler
>>>>>>>> that checks for the cookie and attaches your own custom
session object to
>>>>>>>> the exchange based on the cookie.
>>>>>>>>
>>>>>>>> On Tue, Mar 28, 2017 at 9:41 PM, Eric B
<ebenzacar(a)gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Stuart,
>>>>>>>>>
>>>>>>>>> My goal is to actually replace the JSESSIONID
cookie/mechanism
>>>>>>>>> with my own mechanism. I am looking to use a
JsonWebToken (JWT) to pass my
>>>>>>>>> JSESSIONID to the application for a few different
reasons:
>>>>>>>>> 1) I would like to sign the JSESSIONID
>>>>>>>>> 2) I would like to pass additional data along with
the JSESSIONID
>>>>>>>>> (ex: some auth claims)
>>>>>>>>> 3) I want to be able to share this information
between different
>>>>>>>>> containers
>>>>>>>>> 4) I want to pass a TTL with my token
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> At some level, I am trying to hack together an SSO
solution
>>>>>>>>> temporarily which would allow me to log into one
container, and have some
>>>>>>>>> credentials pass to another container. My issue is
that both containers
>>>>>>>>> are session based, and hence, need to be able to
retrieve a session from a
>>>>>>>>> sessionId. However, I also want to make sure that
sessions don't expire -
>>>>>>>>> that is if I am working in container 2, that my
session in container 1
>>>>>>>>> continues to live (if the user gets redirected back
to container 1).
>>>>>>>>>
>>>>>>>>> So, in essence, I am looking to be able to extract my
SessionId
>>>>>>>>> from a mechanism other than the standard JSESSIONID
cookie, but yet, still
>>>>>>>>> continue to use the sessions seamlessly.
>>>>>>>>>
>>>>>>>>> I figure I could potentially hack around the design
using the
>>>>>>>>> SessionConfigWrapper in which I use the wrap() method
to return my own
>>>>>>>>> SessionConfig object, but that does not seem to fit
in the spirit or design
>>>>>>>>> of the wrapper.
>>>>>>>>>
>>>>>>>>> Is there another/better way to accomplish something
like this?
>>>>>>>>> Or is undertow designed with only the JSESSIONID
cookie in mind? I did
>>>>>>>>> notice the
>>>>>>>>> SessionConfig.SessionCookieSource enum with value
OTHER, but
>>>>>>>>> cannot seem to see/figure out where that is used, or
how to leverage that
>>>>>>>>> setting. I looked through the ServletContextImpl
class but only see the
>>>>>>>>> SessionTrackingMode of COOKIE, SSL and URL
available.
>>>>>>>>>
>>>>>>>>> Any help/insight would be greatly appreciated.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>>
>>>>>>>>> Eric
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Tue, Mar 28, 2017 at 7:57 PM, Stuart Douglas <
>>>>>>>>> sdouglas(a)redhat.com> wrote:
>>>>>>>>>
>>>>>>>>>> Why do you need a custom SessionConfig? In
general Servlet will
>>>>>>>>>> use
>>>>>>>>>> its own SessionConfig that matches the
configuration of the
>>>>>>>>>> deployed
>>>>>>>>>> application (generally just using a JSESSIONID
cookie, unless it
>>>>>>>>>> has
>>>>>>>>>> been customized).
>>>>>>>>>>
>>>>>>>>>> Stuart
>>>>>>>>>>
>>>>>>>>>> On Tue, Mar 28, 2017 at 2:19 PM, Eric B
<ebenzacar(a)gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>> > I've been trying to figure out how to
build my own custom
>>>>>>>>>> SessionManager to
>>>>>>>>>> > push my sessions into Redis with a custom
SessionConfig
>>>>>>>>>> implementation, but
>>>>>>>>>> > am having trouble finding any documentation
to that extent.
>>>>>>>>>> >
>>>>>>>>>> > For the SesisonManager, I've read that I
need to:
>>>>>>>>>> >
>>>>>>>>>> > Develop SessionManager which implements
>>>>>>>>>> > io.undertow.server.session.SessionManager
>>>>>>>>>> > Develop SessionManagerFactory which
implements
>>>>>>>>>> >
io.undertow.servlet.api.SessionManagerFactory
>>>>>>>>>> > Develop startup extension which implements
>>>>>>>>>> > io.undertow.servlet.ServletExtension, and
in
>>>>>>>>>> handleDeployment(Deployment)
>>>>>>>>>> > method change sessionManagerFactory with
new
>>>>>>>>>> SessionManagerFactory.
>>>>>>>>>> > Register new ServletExtension by adding
>>>>>>>>>> >
../META-INF/services/io.undertow.servlet.ServletExtension
>>>>>>>>>> file (file should
>>>>>>>>>> > contain the name of new ServletExtension.
for example
>>>>>>>>>> > com.my.utils.StartupExtension)
>>>>>>>>>> >
>>>>>>>>>> >
>>>>>>>>>> > But I can't seem to find anything that
indicates how to
>>>>>>>>>> provide my own
>>>>>>>>>> > SessionConfig implementation. How do I
register a custom
>>>>>>>>>> SessionConfig
>>>>>>>>>> > implementation? Is there any documentation
to that extent?
>>>>>>>>>> >
>>>>>>>>>> > Are there any examples that can show me how
to create my own
>>>>>>>>>> SessionManager
>>>>>>>>>> > and SessionConfig object?
>>>>>>>>>> >
>>>>>>>>>> > Thanks,
>>>>>>>>>> >
>>>>>>>>>> > Eric
>>>>>>>>>> >
>>>>>>>>>> >
_______________________________________________
>>>>>>>>>> > undertow-dev mailing list
>>>>>>>>>> > undertow-dev(a)lists.jboss.org
>>>>>>>>>> >
https://lists.jboss.org/mailman/listinfo/undertow-dev
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> undertow-dev mailing list
>>>>>>>>> undertow-dev(a)lists.jboss.org
>>>>>>>>>
https://lists.jboss.org/mailman/listinfo/undertow-dev
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> undertow-dev mailing list
>>>>>>>> undertow-dev(a)lists.jboss.org
>>>>>>>>
https://lists.jboss.org/mailman/listinfo/undertow-dev
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>