【bug记录】This attempt to set a cookie via a Set-Cookie header was blocked because it had the “Secure“

问题出现场景

最近在使用浏览器访问一个登录页面时会一直发生302重定向请求,然后f12看到浏览器的访问页面上有如下警告
在这里插入图片描述

错误原因

错误原因为:尝试通过Set-Cookie头设置具有“secure”属性的cookie,但未通过安全连接接收,因此被阻止。因为具有“secure”属性的cookie只能通过安全的https连接传输,所以浏览器阻止了此操作。

查看了一下访问协议,确实是使用了http协议地址。然后查看这个接口对于cookie的设置。这个接口是登录相关的接口,将sid等信息填入cookie,然后查询发现是shiro框架对其进行了配置。

shiro.cookie-secure = true

shiro.cookie-secure 是 Apache Shiro 框架的配置选项之一,用于控制生成的 Cookie 是否应该标记为 “Secure”。“Secure” Cookie 是一种安全的 Cookie,只能在通过 HTTPS 连接传输时才会被浏览器发送。这有助于确保敏感信息只在加密的连接中传输。
当你将 shiro.cookie-secure 设置为 true 时,Apache Shiro 会生成 ‘Secure’ Cookie,这意味着浏览器只会在通过 HTTPS 连接发送请求时将这些 Cookie 包括在请求中。这增加了敏感数据的安全性。

问题修改

将shiro.cookie-secure置为false即可

shiro.cookie-secure = false

正常访问结果如下:可以看到http协议下的sid已正常携带
在这里插入图片描述

cookie-secure相关补充

servlet

对于类似的报错原因,应该去查询关于cookie的设置,常见的设置可以是通过servlet方式

import javax.servlet.http.Cookie;

// 创建一个Cookie
Cookie cookie = new Cookie("myCookie", "cookieValue");

// 设置Secure属性为true,表示这是一个Secure Cookie
cookie.setSecure(true);

// 设置Cookie的其他属性,如路径、域、过期时间等
cookie.setPath("/"); // 设置Cookie的路径
cookie.setDomain(".example.com"); // 设置Cookie的域
cookie.setMaxAge(3600); // 设置Cookie的有效期(秒)

// 将Cookie添加到HTTP响应中
response.addCookie(cookie);

想要通过http访问,则需要将cookie.setSecure(false);

springSecurity

Spring Security也提供了类似的配置选项来控制生成的Cookie的安全属性,Spring Security中配置Cookie的相关属性通常涉及到Remember-Me功能以及Session管理。以下是一个例子,展示了如何配置Remember-Me Cookie的secure属性:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
    
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .rememberMe()
                .key("my-remember-me-key") // 设置Remember-Me Cookie的密钥
                .rememberMeCookieName("remember-me-cookie") // 设置Remember-Me Cookie的名称
                .tokenValiditySeconds(3600) // 设置Remember-Me Cookie的有效期
                .useSecureCookie(true); // 设置Remember-Me Cookie是否为安全Cookie
    }
}

想要正常访问,需要设置.useSecureCookie(false);

总之对于此问题要找寻cookie设置相关

猜你喜欢

转载自blog.csdn.net/qq_40454136/article/details/132977503