许多框架在封装的时候由于各种安全等原因,导致使用自身的封装请求时每次都是使用新的会话,导致每次的sessionid都不同。
解决方法:
1.如微信小程序
可以直接修改 header.cookie = ‘SESSION=’ + sessionId cookie里面的数据时可以考虑在后端校验成功后将当次的sessionid返回到页面,页面再修改cookie进行下一次请求,如果过期了,再调用后台登录方法,重新执行上一步,然后重发请求即可。如我文章
公众号基础的小程序搭建中说明。
2.如我使用过的白鹭引擎(无法直接编辑 请求中的header.cookie)
用到过的人都知道,自带的请求不能直接编辑cookie或者在请求中附带set-cookie等关键字。修改sessionid到其中是不行的(=-= 尝试过N次失败的经历),就可以使用如白鹭请求的request.withCredentials = true 【表明在进行跨站(cross-site)的访问控制(Access-Control)请求时,使用认证信息(例如cookie或授权的header)】然后在后端修改过滤器/或者未被过滤器拦截的接口,加上:
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "0");
主要就是前三句,一二两句可以支持方法1中的附加sessionid,也可以支持第二种,直接使用认证信息的方式。并且第一句request.getHeader(“Origin”) 的使用比"*"好,因为如果是方法2中使用认证信息就需要配置的Access-Control-Allow-Origin和客户端设置的相同。