【问题标题】:Spring Boot 1.4.0 does not append jvmroute to jsessionidSpring Boot 1.4.0 不会将 jvmroute 附加到 jsessionid
【发布时间】:2018-08-03 16:37:39
【问题描述】:

我们一直在使用 tomcat jvmroute 属性来支持会话亲和性(是的,我们希望在某个时候摆脱这种情况)。

当我使用 spring boot 1.3.7 时,jvmroute 值被附加到 jsessionid(仍然使用 tomcat 8.x)。但由于某种原因,spring boot 1.4.0 没有。

我很确定这不是 tomcat 问题,因为即使我降级到 tomcat 7,它仍然无法正常工作。另外,我已经调试了 apache StandardEngine 类并且可以看到 jvmroute 属性被应用于 tomcat 8 。X。然而不知何故 jseesionid cookie 在 spring boot 1.4.0 中没有得到正确的值。


@SpringBootApplication
@RestController
public class TomcatJvmrouteApplication {

public static void main(String[] args) {
    System.setProperty("jvmRoute", "testjvmroute");
    SpringApplication.run(TomcatJvmrouteApplication.class, args);
}

@RequestMapping("/info")
public String getInfo(@Value("${jvmRoute}") String route, HttpSession session,
        @CookieValue("JSESSIONID") String cookie) {
    String jsessionId = cookie == null ? "" : new String(cookie.getBytes());
    return "Jvmroute should be: " + route + " <br/> Jsessionid is:" + jsessionId;
}

}

项目 pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>demo.tomcat</groupId>
    <artifactId>jvmroute-demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>tomcat-jvmroute</name>
    <description>demo jvmroute issues</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

【问题讨论】:

标签: spring-boot


【解决方案1】:

这是 spring boot 1.4.0 中的一个 bug,请看这个 issue: https://github.com/spring-projects/spring-boot/issues/6679

这是 Andy Wilkinson 发布的 1.4.0 解决方法。只需将此 bean 添加到您的应用程序上下文中。

@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return (container) -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            ((TomcatEmbeddedServletContainerFactory) container).addContextCustomizers((context) -> {
                context.addLifecycleListener((event) -> {
                    if (event.getType().equals(Lifecycle.START_EVENT)) {
                        ((Context) event.getSource()).getManager().getSessionIdGenerator()
                                .setJvmRoute(((ManagerBase) context.getManager()).getJvmRoute());
                    }
                });
            });
        }
    };
}

【讨论】:

    【解决方案2】:

    我正在使用 Spring Boot 2.0.4。我必须这样做:

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
        return (tomcat) -> {
    
            tomcat.addContextCustomizers((context) -> {
                Manager manager = context.getManager();
                if (manager == null) {
                    manager = new StandardManager();
                    context.setManager(manager);
                }
    
                ((ManagerBase) context.getManager()).getEngine().setJvmRoute("tomcatJvmRoute");
    
            });
        };
    }
    

    我原来的answer

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 2012-07-28
      • 2018-09-12
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多