在 spring 中自动将安全标志添加到 JSESSIONID cookie

新手上路,请多包涵

我有一个位于 nginx 后面的 tomcat 应用程序服务器。 SSL 在 nginx 上终止。部署在 tomcat 上的 Spring web-mvc 应用程序应在 JSESSIONID 上设置安全标志。如果 spring 对此有一些自动检测,那会很酷,这样我在开发过程中就不会被打扰,因为我那里没有 SSL。

有没有办法告诉 spring 自动设置标志?

我使用 JavaConfig 设置应用程序并使用 Maven 创建可部署的 war 文件。

我已经检查过了,但这看起来有点丑陋和静态: 将“安全”标志设置为 JSESSION id cookie

原文由 ST-DDT 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 524
2 个回答

当你使用 spring-session 时,例如在 reddis 中持久化你的会话,这确实是自动完成的。 cookie 是由 org.springframework.session.web.http.CookieHttpSessionStrategy 创建的,它在 CookieHttpSessionStrategy#createSessionCookie 检查请求是否来自 HTTPS 并相应地设置安全:

 sessionCookie.setSecure(request.isSecure());

如果您 使用 spring-session,则可以使用 ServletContextInitializer 配置安全 cookie。使用 应用程序属性,根据配置文件将其设置为真/假。

 @Bean
public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}") boolean secure) {
    return new ServletContextInitializer() {

        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.getSessionCookieConfig().setSecure(secure);
        }
    };
}

application.properties(当配置文件“prod”未激活时在开发中使用):

 secure.cookie=false

application-prod.properties(仅在配置文件“prod”处于活动状态时使用,覆盖 application.properties 中的值):

 secure.cookie=false

使用以下命令在产品服务器上启动您的应用程序:

 --spring.profiles.active=prod

如果到目前为止您还没有使用过配置文件,这听起来需要付出一些努力,但是您很可能无论如何都需要一个用于生产环境的配置文件,所以这真的很值得。

原文由 Stefan Isele - prefabware.com 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您使用的是 Spring Boot,则有一个简单的解决方案。只需在您的 application.properties 中设置以下属性:

 server.servlet.session.cookie.secure=true

资料来源: Spring 文档 - 附录 A. 常见应用程序属性

如果您有一些环境使用 HTTPS 而另一些没有,则需要在没有 HTTPS 的配置文件中将其设置为 false。否则安全 cookie 将被忽略。

原文由 Jonask 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题