On Feb 13, 2013, at 4:26 AM, Keiichi Fujino wrote:

> 2013/2/13  <ma...@apache.org>:
>> Author: markt
>> Date: Wed Feb 13 09:28:58 2013
>> New Revision: 1445517
>> 
>> URL: http://svn.apache.org/r1445517
>> Log:
>> Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54552
>> Servlet 3.1
>> Implement HttpSessionIdListener and HttpServletRequest#changeSessionId()
>> Patch provided by Nick Williams.
>> 
> I think that this code itself is not a problem at all. (I think prety good.)

Thanks! I was a bit nervous about my first code contribution. :-)

> However I have a idea of code improvement.
> 
> There seems to be a duplicate code on ManagerBase and DeltaManager.

I struggled with that, too. There's a tellNew() method in StandardSession that 
is responsible for firing the Session.SESSION_CREATED_EVENT event and notifying 
HttpSessionListeners, and I thought about implementing a similar 
tellChangedSessionId method in StandardSession. However, since the code for 
firing the Context.CHANGE_SESSION_ID_EVENT internal event was also duplicated 
in ManagerBase and DeltaManager, I decided to stick with doing the same and 
keeping the code alongside those event firings. I would not disagree that the 
code should be centralized…in both cases.

> e.g.
> By introducing a following method to ManagerBase and DeltaManager,
> we might be able to avoid code duplication.
> 
> ==
> changeSessionId(Session session, String newId)
> changeSessionId(Session session, String newId,
>    boolean notifySessionListeners, boolean notifyContainerListeners)
> ==

If you are going to add a method to prevent code duplication, I would recommend 
it be something like StandardSession.tellChangedSessionId(String, String, 
boolean, boolean) (perhaps right below the tellNew() method) instead of in the 
ManagerBase class.

> 
> And furthermore, we are changing sessionId in JvmRouteBinderValve.
> Change sessionid of JvmRouteBinderValve is completely different from
> Manager#changeSessionId.
> By using new changeSessionId method, will be able to change sessionId
> in a same way.
> As a result, JvmRouteSessionIDBinderListener will be unnecessary.

I took a look at JvmRouteSessionIDBinderListener and I do not believe it is 
changing the session ID in the same way (though I could certainly be wrong). It 
looks to me like it is involved in binding the JVMRoute to the end of the 
session ID in order to support clustering? I do not think that is the same 
thing as this.

Other areas in the code that "change" the session ID 
(changeSessionIdOnAuthentication, change replicated from another cluster, 
HttpServletRequest.changeSessionId()) call the changeSessionId(Session) method 
on the Manager, which changes the sessionId, does NOT call tellNew(), fires 
Context.CHANGE_SESSION_ID_EVENT and (now) notifies HttpSessionIdListeners. 
However, JvmRouteSessionIDBinderListener does it differently: it calls setId() 
directly on the session, DOES call tellNew() (is this right?) and bypasses the 
Context.CHANGE_SESSION_ID_EVENT and listeners by not calling 
Manager.changeSessionId(Session).

It could be that this was done this way intentionally, or not. I don't know. 
I'd like to understand it better. Someone more in-the-know than I can hopefully 
chime in.

> 
> I'm going to fix these improvements If there is no objections from anyone.
> Any objections and comment?

If my code can be improved, I am always happy for someone to do it!

Nick

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to