Hi all,

I have a web application that is installed on a virtual host that has a number of subdomains defined with <Alias> elements in server.xml. We would like cookie sessions persist to across these subdomains, and I understand that this is not standard as defined in the servlet specification. Therefore I am trying to write a custom Valve that re-writes the domain on a Cookie to be ".mydomain.com", rather than "www.mydomain.com". From searching the web to looking at what Daniel Rall wrote for Tomcat 4 I have tried the invoke() method below in my valve. Unfortunately, it doesn't seem to work; in my log I see the debug output that tells me the domain is being set, but when I look at the cookie in my Firefox web developer toolbar it says that the host of the cookie is www.mydomain.com.

Has anyone got this to work in Tomcat 5.5.2? Why doesn't this code work and can anybody tell me if there is anything else I need to change? From what I can tell if this doesn't work my options are to edit Tomcat sources or persuade the boss to get Resin (which supports this feature).

BTW I already have cookies="false" in my Context for the time being, its OK as an interim measure but I'd prefer to have cookies sorted.

public void invoke(Request request, Response response) throws IOException, ServletException
   {
      if(request instanceof HttpServletRequest &&
         response instanceof HttpServletResponse &&
         request.getCookies() != null)
      {
        HttpServletRequest httprequest = (HttpServletRequest) request;
HttpServletResponse httpresponse = (HttpServletResponse) response;

boolean domainwasset = setDomainOnCookies(request.getCookies());
        if(!domainwasset)
        {
           HttpSession session = httprequest.getSession();
           if(session.isNew())
           {
containerLog.info((session.isNew() ? "new" : "old") + " session, requested ID=" + httprequest.getRequestedSessionId() + ", actual ID =" + session.getId());


Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME, session.getId());
           cookie.setMaxAge(-1);

           // Set the cookie path
           String cookiepath = getCookiePath();
           if(cookiepath == null || cookiepath.trim().length() == 0)
           {
               cookiepath = request.getContextPath();
               if(cookiepath == null || cookiepath.trim().length() == 0)
               {
                  cookiepath = "/";
               }
           }

           if(httprequest.isSecure())
           {
             cookie.setSecure(true);
           }

           cookie.setDomain(getCookieDomain());
           containerLog.info("Adding cookie for "+ getCookieDomain());
           httpresponse.addCookie(cookie);
           }
        }

      }

      // We're done, bring on the next valve
      if(next != null)
      {
         next.invoke(request, response);
      }
   }

   private boolean setDomainOnCookies(Cookie[] cookies)
   {
      boolean domainset = false;
      if(cookies != null)
      {
         for(Cookie c : cookies)
         {
if(c != null && c.getName().equals(Globals.SESSION_COOKIE_NAME))
            {
containerLog.info("Setting cookie " + c.getName() +" to " + getCookieDomain() + ", was " + c.getDomain());
               c.setDomain(getCookieDomain());
               domainset = true;
            }
         }
      }

      return domainset;
   }


Thanks in advance
Dan Garland
[EMAIL PROTECTED]

______________________________________________________________________
This email has been scanned by the MessageLabs Email Security System.
For more information please visit http://www.messagelabs.com/email ______________________________________________________________________

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to