我正在使用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中没有Expires
的Common 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
,请使用添加了EmbeddedServletContainerCustomizer
的TomcatContextCustomizer
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());
}
});
}
}
};
}