跨域cookie传输丢失问题(兼容高低版本谷歌游览器)

问题: 66版本以上的谷歌游览器,默认Cookie的 SameSite 属性为Lax,导致无法跨域传输cookie

SameSite 有3个值

1. Strict

Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。

2. Lax

Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。

3. None

Chrome 80版本后将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

所以当我们需要跨域传输cookie时就必须设置SameSite=None;Secure=true

但是问题来了,当我们设置为SameSite=None;Secure=true后发现,51-66版本的谷歌无法正常使用cookie了,原因是这些版本的SameSite属性并没有None值

解决方案

在写入cookie时判断游览器版本 再设置cookie的SameSite值

判断游览器版本获取SameSite值

public static String getSameSize (HttpServletRequest request){
        String userAgent = request.getHeader("user-agent");
        Browser browser = UserAgent.parseUserAgentString(userAgent).getBrowser();
        log.info("browser Name:"+browser.getName());
        if(browser!=null&&browser.getName().contains("Chrome")){
            Version version = browser.getVersion(userAgent);
            if(version.getMajorVersion()!=null){
                try{
                    int majorVersion = Integer.parseInt(version.getMajorVersion());
                    log.info("majorVersion:"+majorVersion);
                    // 如果是谷歌并且版本小于67,则设置为null
                    if(majorVersion<67){
                        return null;
                    }
                }catch (Exception e ){
                    e.printStackTrace();
                }
            }
        }
        return "None";
    }

添加cookie

String sameSize=CookieUitl.getSameSize(request);
ResponseCookie cookie = ResponseCookie.from(RANDOM_CODE_KEY, sRand.toString()) // key & value
                .httpOnly(false)		// 禁止js读取
                .secure(false)		// 在http下也传输
                .path("/")			// path
                .maxAge(Duration.ofHours(1))	// 1个小时候过期
                .sameSite(sameSize)	// 大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外
                .secure(true) 
                .build();
        //若一个请求中要添加多个cookie,改为addHeader
        response.setHeader("Set-Cookie",cookie.toString());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值