如何为 JSESSIONID 和 jvmRoute 更改 Tomcat 中的 delimiter/separator?

How to change the delimiter/separator in Tomcat for JSESSIONID and jvmRoute?

使用 Tomcat 9.0.13,openJDK 8 运行在 rhel 7 上运行。
我们的应用程序曾经在 Websphere 上使用 运行,其中可以使用 CloneSeparatorChange 指定会话路由分隔符。 JSESSIONID 存储在设置为 Secure 和 HttpOnly 的 cookie 中。

Tomcat 通常使用“.”作为 JSESSIONID 和 jvmRoute(Websphere 世界中的 CloneID)之间的分隔符,但我们的代码期望在 Websphere 中设置“:”。

我的问题:有没有办法将 sessionid 分隔符从“.”更改为“.”?对于另一个字符,说“:” ?

jvmRoute 由 SessionIdGenerator Component 接口的实现处理。 标准实现 org.apache.catalina.util.StandardSessionIdGenerator 不提供配置用于将 jvmRoute 添加到 JSESSIONID 的分隔符的方法: https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java#L52-L59 :

if (route != null && route.length() > 0) {
    buffer.append('.').append(route);
} else {
    String jvmRoute = getJvmRoute();
    if (jvmRoute != null && jvmRoute.length() > 0) {
        buffer.append('.').append(jvmRoute);
    }
}

'.'字符是硬编码的,因此您无法通过配置更改它。 幸运的是,您可以配置用于生成 SessionId 的 class:

我的建议是扩展 StandardSessionIdGenerator class,通过调用 super 方法并替换字符来覆盖 generateSessionId。

class CustomSessionIdGenerator extends StandardSessionIdGenerator{
    @Override
    public String generateSessionId(String route) {
        String sessionId = super(route);
        return sessionId.replace('.',':');
    }
}

然后您可以在 tomcat 的配置文件中的上下文组件内的管理器组件中配置您的 CustomSessionIdGenerator class,例如 context.xml。