I want to strip JsessionId from the url (for browsers who dont support
cookies) for SEO purposes.
btw: perhaps a bit long-winded as to the why's, but it may help others. 

At first I implemented a servletfilter (from
http://randomcoder.com/articles/jsessionid-considered-harmful)
which basically consists of passing a subclassed httpServletResponse where
i've overwritten the encodeUrl() method to not to include the jsessionid.
This works well. 

However I do not want to strip the jsesisonid when the user has logged in.
The rationale here is that I really do need a session when a user is logged
in, and since a searchengine doesn't login (at least I don't program for it)
It can't harm to make this exception. 

The application recognizes that a user is logged in if a User-instance is
present in the ASM (ApplicationStateManager). 
This means I have to let the notion of a requesthandler go, and go instead
with a tapestry dispatcher, since a servlet requesthandler has no way f
getting the ASM of the current user. (Is this correct?) 

Not much changed to the dispather (in relationship to the code in the
requestfilter before). The Dispatcher is also correctly registered in
AppModule etc. 

The problem is that although I see that jsessionid is stripped in the custom
encodeUrl-method, if appears afterwards in request (as noticed in the
address-bar).  So my question is: What code inserts the jsessionid-again,
after the Response.encodeUrl()-method, and how can I change it's behavior?

the relevant code:

//Appmodule
public static void bind(ServiceBinder binder)
{
        binder.bind(AccessController.class).withId("AccessController");
        binder.bind(AutoLoginController.class).withId("AutoLoginController");
        
binder.bind(SessionStripController.class).withId("SessionStripController");
}

public void contributeMasterDispatcher(OrderedConfiguration<Dispatcher>
configuration,
                        @InjectService("AccessController") Dispatcher 
accessController,
                        @InjectService("AutoLoginController") Dispatcher 
autoLoginController,
                        @InjectService("SessionStripController") Dispatcher
sessionStripController) {
                configuration.add("AccessController", accessController,
"before:PageRender");
                configuration.add("AutoLoginController", autoLoginController,
"before:AccessController");
                configuration.add("SessionStripController",
sessionStripController,"before:AutoLoginController");
        }

//sessionstripcontroller
public final class SessionStripController implements Dispatcher {

        
        private ApplicationStateManager asm;
        private RequestGlobals globals;

        public SessionStripController(ApplicationStateManager asm,RequestGlobals
globals){
                this.asm = asm;
                this.globals = globals;
        }
        
        public boolean dispatch(Request req, Response response) throws 
IOException
{
                // clear session if session id in URL
                if (req.isRequestedSessionIdValid() &&
globals.getHTTPServletRequest().getCookies()==null)
                {
                        Session session = req.getSession(false);
                        if (session != null) session.invalidate();
                        ServletResponseWrapper wrapResp = new 
ServletResponseWrapper(globals.getHTTPServletResponse());
                        globals.storeRequestResponse(req, wrapResp);
                }
                return false;
        }
}

//ServletResponseWrapper
public class ServletResponseWrapper extends ResponseImpl{
                public ServletResponseWrapper(HttpServletResponse response) {
                        super(response);
                        // TODO Auto-generated constructor stub
                }

                @Override
                public String encodeRedirectURL(String url) {
                        url = super.encodeRedirectURL(url);
                        return url; 
                }
                
                @Override
                public String encodeURL(String url) {
                        url = super.encodeURL(url);
                        url = url.substring(0,url.indexOf(";"));
                        return url; 
                }
}

btw: encodeRedirectURL and encodeURL can just return <url> straightaway, but
the above code enabled me to see that indeed this code stripped the added
jsessionid that super.encode*Url() added. So where is the other method
that's adding jsessionid? 

Cheers, 
Britske

-- 
View this message in context: 
http://www.nabble.com/stripping-jsessionid-in-custom-dispatcher-depending-on-ASM.-tp18351016p18351016.html
Sent from the Tapestry - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to