在我们的项目中,接口验证都是用的token。token代表是否为同一个用户、同一次会话
一、手机端对接:在与手机端测试接口,出现session中token失效问题
问题1:在某一个接口中写测试数据,把服务器端session的某一个值写死了,在解密手机端传过来的token时,发现信息不一致,就报错了。
问题2:电视端进首页,有部分节点下面的内容是不需登录就能看到的内容,有的是必须登录才能操作的。但是安卓那边写的逻辑有问题,需要登录获取的节点内容他放在了登录之前,调用接口时检测token就报错了。
二、在与前端对接微信小程序的接口时,session失效问题
问题:前几天在做微信小程序中,前端调用接口一直是token失效。
网上搜索了一下,原来小程序的访问流程是:小程序---》微信服务器----》目标服务器,会通过微信服务器进行中转。因此在小程序中,由wx.request()发起的每次请求对于服务器来说都是不同的会话,这样导致后续请求都相当于未登录的状态。
解决1:在用户登录时,我把服务端生成的会话sessionId返回到客户端(小程序),客户端小程序保存sessionId到本地,在客户端之后的每一次请求中都携带请求头 sessionId 就可以解决这个问题。
//session 未过期,并且在本生命周期一直有效,获取本地取存储的sessionID
var session_id = wx.getStorageSync('PHPSESSID');
//header头部加入cookie,注意:PHPSESSID为php服务器跟浏览器中cookie中的session_id名字,不能更换,java为:JSESSIONID
var header = { 'content-type': 'application/x-www-form-urlencoded', 'Cookie': 'PHPSESSID=' + session_id }
//传值给服务器获取并存储
wx.request({
url: '',
data: {},
method: 'POST',
header: header,
success: function (res) {}
});
注意:如果服务器端对session设置了有效期,则服务器端需要在它过期之前定时刷新sessionId ,客户端也需要定时发起请求去获取新的sessionId。
解决2:因为公司里之前接口请求与验证,都是使用session。但其实我们只是为了标志到底是哪个用户的哪次访问,既然在小程序里面不能使用cookie,那利用缓存也是可以的,redis和memcache也是有同样的效果,并且都能够设置有效期。