Spring Boot 1.4.0不会将jvmroute附加到jsessionid

时间:2016-08-17 13:06:28

标签: spring-boot

我们一直在使用tomcat jvmroute属性来支持会话亲和性(是的,我们希望在某个时候离开它)。

当我使用spring boot 1.3.7时,jvmroute值会附加到jsessionid(仍然使用tomcat 8.x)。但由于某种原因,春季启动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;
}

}

Project pom:

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;
}

2 个答案:

答案 0 :(得分:1)

这是spring boot 1.4.0中的一个错误,请看这个问题: 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());
                    }
                });
            });
        }
    };
}

答案 1 :(得分:0)

我正在使用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