0

我在 Tomcat 6.0.24 上运行一个 Java 应用程序,它需要能够在运行时动态更改 JSESSIONID cookie 的 PATH。在决定最简单的方法可能是扩展 org.apache.catalina.core.StandardContext 并覆盖 getEncodedPath 函数之前,我花了很长时间尝试在过滤器中操作 cookie。

我创建了一个名为 MultiTabContext 的自定义上下文,它扩展了 StandardContext 并删除了所有出现的类路径问题。我已经在 catalina/conf/server.xml 中定义了我的上下文(我知道它应该在 context.xml 中,但我稍后会解决这个问题):

<Server port="8005" shutdown="SHUTDOWN">
  ...
  <Service name="Catalina">
    ...
    <Engine name="Catalina" defaultHost="localhost">
      ...
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
        ...
        <!-- HERE IS MY CONTEXT -->
        <Context className="foo.app.server.MultiTabContext"
                 path=""
                 crossContext="false"
                 debug="0"
                 reloadable="true"/>
      </Host>
    </Engine>
  </Service>
</Server>

这是我的 MultiTabContext:

package foo.app.server;

import org.apache.catalina.core.StandardContext;

public class MultiTabContext extends StandardContext {

    @Override
    public String getEncodedPath() {
        return super.getEncodedPath();
    }
}

因为路径是“”,所以我希望在每个请求上都使用我的上下文,而不是 StandardContext。但是,该应用程序仍在使用 StandardContext,而不是我的。任何人都知道如何定义上下文,以便 Tomcat 使用我的而不是 StandardContext(或者知道动态更改 JSESSIONID cookie 路径的更好方法)?

4

1 回答 1

0

我不确定天气是否有助于回答您的问题。但是,我有一种方法可能会有所帮助。当请求得到处理时,您可以在运行时更改 JSESSIONID cookie 路径。

/**
 * This gets the information from the request
 * 
 * @param parameter, pass JSESSION ID 
 * @return
 */
protected String getRequestInfo(HttpServletRequest request, String parameter)
{
    Cookie[] cookies = null;
    if (request.getRequestURI() == null || request.getRequestURI().length() == 0) 
    {
        performanceLogger.debug(" Request generated null pointer");
    }
    try 
    {
        cookies = request.getCookies();
    } 
    catch (Exception ex)
    {
        cookies = null;

    }
    if (cookies == null || cookies.length == 0)
    {
        return null;
    }

    String paramValue = null;
    for (Cookie c : cookies)
    {
        if (c.getName().equals(parameter)) 
        {
            //change the path of JESSION ID over here 
            break;
        }
    }
    return paramValue;
}
于 2013-01-31T22:52:45.110 回答