Chrome浏览器升级80以后导致重定向自动登录失效问题记录和解决方案

问题

Chrome 浏览器升级到80版,针对sameSite设置更加严格,默认不允许设置第三方Cookie

查阅资料都是讲述为什么Chrome采取更加严格的cookie设置策略,没有详细的解决方案

我的情况说明,希望对你们有参考价值

环境:因为本站被嵌入到其他产品中使用,需要在iframe中实现自动登录,相当于我们站点是第三方在人家的产品中设置cookie来实现自动登录

 

参考资料

sameSite 介绍: https://www.cnblogs.com/gxp69/p/12565927.html

浏览器设置解决:https://www.cnblogs.com/tianma3798/p/13517449.html

后端Tomcat设置解决:https://stackoverflow.com/questions/57505939/how-to-set-samesite-cookie-in-tomcats-cookie-processor

方案:

肯定不可以在浏览器端设置,容易造成安全漏洞,因此只能通过后端来进行适配解决

因为samesite 设置为none, 必须是secure,也就是采用https协议

在Nginx中对本站配置https配置,配置完成后,发现中间有一环是sendRedirect重定向,请求协议从https降级到http,又需要解决这个问题

解决方案

1.Nginx 的location 中新增

proxy_set_header X-Forwarded-Proto $scheme;

2.Tomcat中的server.xml中新增

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

...
         <Valve className="org.apache.catalina.valves.RemoteIpValve" 
      protocolHeader="X-Forwarded-Proto" />
....
      </Host>

3.代码中设置获取https协议

/**
	 * 返回应用的根URL,包含结尾的<code>/</code>。兼容存在Apache
	 * mod_proxy反向代理的情况:首先判断是否有x-forwarded-host头,如有则从中得出原始请求的HOST头,再计算.
	 * (详见http://httpd.apache.org/docs/2.2/mod/mod_proxy.html) <b>例子</b>: if request
	 * "http://localhost:8080/app1/dir1/page1.jsp", the method return "http://localhost:8080/app1".
	 * 增加X-Forwarded-Proto头判断,如果有,则从请求中获取最原始的协议,可支持https反向代理至http.
	 * 
	 */
	public static String getContextUrl(HttpServletRequest request) {
		String xForwardedHost = request.getHeader("X-Forwarded-Host");
		String orginProtocol = request.getHeader("X-Forwarded-Proto");
		String host = "";
		if (!StringUtil.isEmpty(xForwardedHost)) {
			host = StringHelper.split(xForwardedHost, ",")[0].trim();
		} else {
			host = request.getHeader("Host");
		}
		String protocol = "";
		if (StringUtil.isNotEmpty(orginProtocol)) {
			if (("https").equals(orginProtocol.toLowerCase())) {
				protocol = "https";
			} else {
				protocol = "http";
			}

		} else {
			protocol = request.getScheme();
		}
		return protocol + "://" + host + getContextPathWithSlash(request);
	}

协议问题解决,需要解决第三方Cookie的问题

我用的Tomcat 9.0.38 版本

在Tomcat的conf/context.xml文件中新增

 <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" sameSiteCookies="None"/

 

还有一个小问题,就是http 请求到https的时候referer路径不全

参考资料

https://www.cnblogs.com/amyzhu/p/9716493.html

设置

在html页面的<head>标签中新增

<meta name="referrer" content="no-referrer-when-downgrade">

 

 

浏览器中,当用户尝试访问一个 HTTP 站点时,如果该站点此前通过 HTTPS 提供过内容,并且服务器设置了 HSTS(HTTP Strict Transport Security)头,则浏览器自动将请求重定向到 HTTPS。这种行为虽然提升了安全性,但在某些情况下可能导致网站无法正常访问,例如服务器未正确配置 HTTPS 或证书失效。 ### 解决方案 #### 1. 清除浏览器的 HSTS 缓存 浏览器通常会缓存 HSTS 记录,以确保后续请求直接使用 HTTPS。如果需要临时绕过此限制,可以清除浏览器中的 HSTS 缓存: - **Chrome 浏览器**:进入 `chrome://net-internals/#hsts` 页面,在 "Delete domain security policies" 输入框中输入目标域名并点击删除。 - **Firefox 浏览器**:进入 `about:config` 页面,搜索 `network.http.referer.default_policy` 并设置为 `2`,或手动删除相关域的安全策略。 - **Safari 浏览器**:关闭 Safari 后删除 `~/Library/Caches/com.apple.Safari` 文件夹,并重启 Safari。 #### 2. 修改服务器端配置 如果希望服务器不再强制跳转 HTTPS,可检查并修改 Nginx 或 Apache 的配置文件: ##### Nginx 配置示例 ```nginx server { listen 80; server_name example.com; # 移除或注释以下重定向代码 # return 301 https://$host$request_uri; location / { proxy_pass http://backend_server; } } ``` 同时,如果已启用 HSTS,请移除或调整如下配置: ```nginx add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; ``` #### 3. 使用反向代理处理协议转换问题 在 Java Web 应用中,若前端使用 Nginx 做反向代理,而后端 Tomcat 接收的是 HTTP 请求,但期望返回 HTTPS 地址,可在 Tomcat 中添加 `RemoteIpValve` 处理 X-Forwarded-* 头信息[^4]: ```java @Bean public TomcatServletWebServerFactory servletContainer() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.setUriEncoding(StandardCharsets.UTF_8); RemoteIpValve value = new RemoteIpValve(); value.setRemoteIpHeader("X-Forwarded-For"); value.setProtocolHeader("X-Forwarded-Proto"); value.setProtocolHeaderHttpsValue("https"); factory.addEngineValves(value); return factory; } ``` #### 4. 检查 DNS SSL 证书配置 确保域名解析无误,并且 SSL 证书有效。如果证书已过期或与域名不匹配,浏览器可能阻止连接。可通过工具如 [SSL Labs](https://www.ssllabs.com/ssltest/) 进行检测。 #### 5. 强制回退到 HTTP 在某些测试环境中,可以临时禁用 HTTPS 支持,确保所有服务均通过 HTTP 提供。此时应确保客户端不会主动发起 HTTPS 请求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值