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

最佳答案

除了Max-Age,您还可以添加Expires属性。

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


  alwaysAddExpires
  
  如果这是true,即使对于版本大于零的cookie,Tomcat也会始终将Expires参数添加到SetCookie标头中。这是为了解决一个已知的IE6和IE7错误,该错误导致我忽略SetCookie标头中的Max-Age参数。
  
  如果org.apache.catalina.STRICT_SERVLET_COMPLIANCE设置为true,则此设置的默认值为false,否则默认值为true。


但是在Spring Boot中没有ExpiresCommon application properties。因此,您必须将CookieProcessor更改为LegacyCookieProcessor并进行配置,请参见Spring Boot Reference Guide


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

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

  
  如果有可能,您应该考虑将代码更新为仅存储符合以后Cookie规范的值。但是,如果您无法更改cookie的编写方式,则可以将Tomcat配置为使用LegacyCookieProcessor。要切换到LegacyCookieProcessor,请使用添加了EmbeddedServletContainerCustomizerTomcatContextCustomizer bean:
  
  
@Bean
public EmbeddedServletContainerCustomizer cookieProcessorCustomizer() {
    return new EmbeddedServletContainerCustomizer() {

        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            if (container instanceof TomcatEmbeddedServletContainerFactory) {
                ((TomcatEmbeddedServletContainerFactory) container)
                       .addContextCustomizers(new TomcatContextCustomizer() {

                    @Override
                    public void customize(Context context) {
                       context.setCookieProcessor(new LegacyCookieProcessor());
                    }

                });
            }
        }
   };
}

09-09 21:47
查看更多