自动在Spring中为JSESSIONID cookie添加安全标志

时间:2016-08-31 14:54:04

标签: java spring spring-mvc cookies nginx

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

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

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

我已经检查了这个,但这看起来有点丑陋和静态: set 'secure' flag to JSESSION id cookie

5 个答案:

答案 0 :(得分:10)

使用spring-session时,例如在reddis中坚持你的会议, 这确实是自动完成的。 Cookie由org.springframework.session.web.http.CookieHttpSessionStrategy创建,CookieHttpSessionStrategy#createSessionCookiesessionCookie.setSecure(request.isSecure()); 检查请求是否来自HTTPS并相应地设置安全:

ServletContextInitializer

如果您 使用spring-session,则可以使用@Bean public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}") boolean secure) { return new ServletContextInitializer() { @Override public void onStartup(ServletContext servletContext) throws ServletException { servletContext.getSessionCookieConfig().setSecure(secure); } }; } 配置安全Cookie。 使用application property,根据个人资料将其设置为true / false。

secure.cookie=false

application.properties(在配置文件'prod'未激活时在dev中使用):

secure.cookie=false

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

--spring.profiles.active=prod

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

 type Lead struct {
  FbId string `json:"fbId"`
  Email string `json:"email"`
  Telefono string `json:"telefono"`
  Version string `json:"version"`
  Mac string `json:"mac"`
  Os string `json:"os"`
 }

听起来有些努力,如果你到目前为止还没有使用过配置文件,但是你很可能还需要一个prod环境的配置文件,所以非常值得。

答案 1 :(得分:2)

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

server.servlet.session.cookie.secure=true

来源:Spring docs - Appendix A. Common application properties

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

答案 2 :(得分:0)

你的application.yml中的

只需添加

server:
  session:
    cookie:
      secure: true

答案 3 :(得分:0)

添加其他选项

您可以使用ServletContextInitializer设置安全cookie和仅http标志

 <%

String price=""; 

 price=request.getParameter("price").toString();
out.println(price);  // Here I want to display the value of string "s" that 
// is total price $10 but getting null value

 %>

答案 4 :(得分:0)

在nginx作为ssl端点之后,这并不是一件简单的任务:必须通过nginx标头(X-Forwarded-Proto: https,请参见Using the Forwarded header)检测安全连接
但这很容易通过nginx config解决:

if ($scheme = http) {
    return 301 https://$http_host$request_uri;
}
proxy_cookie_path / "/; secure";