添加过期到Spring Security记住我的cookie

时间:2016-12-27 19:20:49

标签: spring tomcat cookies spring-boot spring-security

我使用Spring Boot 1.4.2(带有嵌入式Tomcat),Spring MVC 4.3.4和Spring Security 4.1.3来构建一个简单的网站。我的登录页面包含一个记住我的复选框,它可以切换是否由Spring Security创建了一个记住我的cookie。

此Cookie在Chrome和Firefox中设置得非常好,但由于IE和MS Edge不使用Max-Age属性,因此只会创建会话Cookie。有没有办法让Spring Security(另外Max-Age)在Expire标题上为记住我的cookie设置Set-Cookie属性?

以下是我的Spring Security配置:

    http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/private/**").authenticated()
            .anyRequest().permitAll()
            .and()
        .httpBasic()
            .and()
        .formLogin()
            .loginPage("/login").permitAll().and()
        .rememberMe()
            .tokenValiditySeconds(365 * 24 * 60 * 60)
            .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);

1 个答案:

答案 0 :(得分:1)

Max-Age的附加内容,您还可以添加Expires属性。

配置是容器的一部分,请参阅Apache Tomcat 8 Configuration Reference

  

alwaysAddExpires

     

如果是true Tomcat将始终向SetCookie标头添加expires参数,即使对于版本大于零的cookie也是如此。这是为了解决已知的IE6和IE7错误,导致我忽略SetCookie标头中的Max-Age参数。

     

如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE设置为true,则此设置的默认值为false,否则默认值为true。

但Spring Boot中Expires没有Common application properties。因此,您必须将CookieProcessor更改为LegacyCookieProcessor并对其进行配置,请参阅Spring Boot Reference Guide

  

70.10使用Tomcat的LegacyCookieProcessor

     

Spring Boot使用的嵌入式Tomcat不支持开箱即用的Cookie格式的“Version 0”,您可能会看到以下错误:

java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value
     

如果可能的话,您应该考虑将代码更新为仅存储符合以后Cookie规范的值。但是,如果您无法更改cookie的写入方式,则可以将Tomcat配置为使用LegacyCookieProcessor。要切换到LegacyCookieProcessor,请使用添加EmbeddedServletContainerCustomizer的{​​{1}} bean:

     
TomcatContextCustomizer