在春季自动将安全标志添加到JSESSIONID Cookie

2022-09-03 04:28:38

我有一个位于nginx后面的tomcat应用程序服务器。SSL在nginx上终止。部署在tomcat上的Spring web-mvc应用程序应该在JSESSIONID上设置安全标志。如果spring有一些自动检测功能,那将是很酷的,所以我在开发过程中不会感到困扰,因为我那里没有SSL。

有没有办法告诉春天自动设置旗帜?

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

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


答案 1

当您使用春季会话时,例如将会话保留在reddis中时,这确实是自动完成的。Cookie的创建方式是检查请求是否通过HTTPS发出并相应地设置安全:org.springframework.session.web.http.CookieHttpSessionStrategyCookieHttpSessionStrategy#createSessionCookie

sessionCookie.setSecure(request.isSecure());

如果不使用 spring-session,则可以使用 .使用应用程序属性,根据配置文件将其设置为 true/false。ServletContextInitializer

@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

在 prod 服务器上使用以下命令启动应用程序:

--spring.profiles.active=prod

如果您到目前为止还没有使用配置文件,那么听起来像是一些努力,但是无论如何,您都可能需要一个prod environment的配置文件,所以它真的值得。


答案 2

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

server.servlet.session.cookie.secure=true

来源:春季文档 - 附录 A. 常见应用程序属性

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


推荐