如何在Tomcat中为JSESSIONID和jvmRoute更改定界符/分隔符?

时间:2019-01-11 20:09:59

标签: java tomcat jsessionid

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

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

我的问题:有没有办法将会话ID分隔符从“”更改为。换一个字符,说“:”?

1 个答案:

答案 0 :(得分:1)

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的类:

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

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

然后,您可以在tomcat的配置文件(例如context.xml)的Context组件内的Manager组件中配置CustomSessionIdGenerator类。