我使用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);
答案 0 :(得分:1)
配置是容器的一部分,请参阅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