我目前正在一个 java 服务器应用程序中工作。使用 spring-boot v2.1.3 并部署在 wildfly v18 上。我尝试强制设置 set-cookie 响应标头的属性“SameSite=None; Secure”。
因此,我尝试创建一个过滤器(SameSiteFilter 类)来在业务逻辑完成后修改响应头。我在 WebSecurityConfigurerAdapter 中配置了这个过滤器。
过滤器配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
String loginUrl = highpotsUrl + "?url=" + redirectUrl;
http
.addFilterAfter(new SameSiteFilter(), BasicAuthenticationFilter.class)
.headers().frameOptions().disable().and()
.authorizeRequests()
.antMatchers("/css/*").permitAll()
.antMatchers("/js/*").permitAll()
.antMatchers("/documents/*").permitAll()
.antMatchers("/security/login").permitAll()
.antMatchers("/iframe/show").permitAll()
.anyRequest().fullyAuthenticated()
.and()
.formLogin()
.loginPage(loginUrl).permitAll()
.and()
.logout().logoutSuccessUrl(loginUrl);
}
}
过滤器本身
@Slf4j
public class SameSiteFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
log.debug("SameSiteFilter::doFilter called");
addSameSiteAttribute(httpResponse); // Works more or less
chain.doFilter(request, response);
// addSameSiteAttribute(httpResponse); // Response modification not visible
}
private void addSameSiteAttribute(HttpServletResponse response) {
log.debug("=== addSameSiteAttribute");
httpLog("before", response);
Collection<String> headers = response.getHeaders(HttpHeaders.SET_COOKIE);
// boolean firstHeader = true;
for (String header : headers) {
response.setHeader(HttpHeaders.SET_COOKIE,
String.format("%s; %s", header, "SameSite=None; Secure"));
}
response.addHeader("MeinNameIst", "Hase");
httpLog("after", response);
}
示例控制器
@RequestMapping("/iframe")
@Controller
@Slf4j
public class IFrameController {
...
@GetMapping("/show")
public ModelAndView show(HttpServletRequest request, HttpServletResponse response,
@RequestParam(required = false) String transactionId)
throws MessageParseException, SignalIdunaConnectionException {
...
据我了解:chain.doFilter(request, response); 做我的控制器通常会做的事情。在我的情况下,例如: IFrameCOntroller::show 被调用。
所以我的想法是调用chain.doFilter,从而设置一个cookie(响应包含带有Set-Cookie键的Header条目)。然后修改可用的标头字段。在我的服务器日志中看起来不错。我可以在响应对象中记录标题。但是修改后的 Response-Headers 似乎并没有真正得到响应。在客户端中,Set-Cookie 标头集中没有 SameSite 属性。
有人可以帮我找到我的思维错误吗?
感谢和亲切的问候哈里 E。