安卓企业微信浏览器session丢失

1.现象

做企业微信开发时,进行前后端分离,前端使用vue开发(移动端组件库使用vant),后端使用原来PC项目(spring+springmvc+JdbcTemplate)开发。前端和后端分别部署在不同的域名服务器上。
在后端进行oauth2授权登录后,将登录信息存储到session,后端重定向到前端地址。前端调用axios请求后端,在后端获取不到保存的session。因为是不同域名,所以在后端有进行跨域配置

后端跨域配置(在后端的登录过滤器添加),这样就跨域进行跨域访问了。

response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, accept, content-type, xxxx");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
response.setHeader("Access-Control-Allow-Origin", "*");

然而因为是使用session进行登录保存的,上面这样配置只能进行跨域请求,而不能保存session,每次请求后端接口获取都是新的session,sessionID都不一样。

要让后端返回cookie,需要设置

response.setHeader("Access-Control-Allow-Credentials", "true");

这样配置的话Access-Control-Allow-Origin就不能配置为*,必须配置具体的域名(WeChatConstant.WE_CHAT_URL为前端服务器域名),所以后端完整的配置为

response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, accept, content-type, xxxx");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
response.setHeader("Access-Control-Allow-Origin", WeChatConstant.WE_CHAT_URL); 
response.setHeader("Access-Control-Allow-Credentials", "true");

前端发送请求也要带上cookie,在axios文档上有个withCredentials属性,默认为false,意思是不携带cookie信息,将他配置为true就可以了发送cookie信息了。

axios.defaults.withCredentials=true;

然而出现一个莫名其妙的问题,就是本来这样子配置后session是可以保存的。但是后面又出现了session保存不了的现象。发现的域名的问题。。。

2.原因分析

猜想了以下几种可能:
后端授权登录后是通过重定向到前端地址的,是不是重定向不能携带cookie。
后端设置后还是没有返回给前端cookie。
axios设置withCredentials=true后,还是不能携带cookie。
微信浏览器不能保存cookie,有时候会丢失。
网上说由于微信内嵌浏览器对所有请求都做了代理,导致出去的ip不固定,所以cookie生效。
前后端分离Cookie sameSite坑 跨域之坑(这个是后面看见,因为不是这个原因,所以没有具体去了解)

因为前后端都是我自己编写的,所以我直接将前端主页不进行登录拦截,然后在手机进行前端主页时,去后端请求一个方法将伪造一个登录信息存储在session中,后面在请求其他方法,发现其他方法被登录过滤器拦截了,所以重定向能不能携带cookie没有具体研究,但是这边session丢失不是因为重定向造成的

在PC上直接访问前端地址,继续伪造登录信息保存在session,调用其他后端方法,发现可以获取session信息,查看的http请求,请求中一直携带jsessionid,所以后端设置后是有返回cookie给前端的,axios也有携带cookie

那么最有可能的微信内嵌浏览器不能保存cookie,将手机和笔记本连接同一个wifi网络,用Fiddler进行抓包,发现微信每次请求后端的域名都是不变的,所以不是微信对所有请求做了代理

3.解决方案

最后还是在网上找到一个大神的博客才解决的,
https://www.cnblogs.com/HKUI/p/6040616.html

具体是跨源发送cookie(withCredentials:true),跨的二级的域,根域必须相同,而且cookie的域必须是根域
比如 a.a.cn可以通过这里所说的跨源 在向b.a.cn发送ajax请求时 带上 .a.cn下的cookie。
不要以为 域在.a.cn下的cookie ,a.a.cn在向b.a.cn发请求时 会自动带上。
也不要认为cookie的跨源能跨根域,是不可能的。

posted @ 2022-10-24 20:56  享受生活2023  阅读(113)  评论(0编辑  收藏  举报