安卓企业微信浏览器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的跨源能跨根域,是不可能的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了