微信小程序Session问题

微信小程序——session

今天做微信小程序的时候,遇到一个问题,就是微信虽然提供了类似于ajax的数据通讯工具wx.request,但是因为不是浏览器,因此这个请求是不会带有sessionid的,那么今天就写一篇来记录如果解决微信小程序session的问题。

sessionid有什么用

因为我只写java web多,所以就以java web为主。那么写过java web的都知道,request是一次请求,session是一个会话周期,但是后台是如何识别请求是属于哪个session的呢?这就要降到cookie和session的关系。

我们都知道,session是服务器维护的会话,cookie是客户端(浏览器)持有的保存一些数据的,那么session实际上是通过cookie识别的。(因此当用户浏览器禁用cookie,也就代表服务器端session也被禁用了,无法得知访问是属于哪个session,因此就不存在session了。但是也不代表完全无法得到)那么当浏览器第一次访问网站,网站会在response的header中添加一个叫做Set-Cookie的字段,这个字段的含义就是让浏览器将这里面的每条数据都放到你的cookie里面,这对于用户开发者都是不可见的,浏览器会自动放入cookie,而每次请求都会带着set-cookie里面的数据在cookie里,因此服务端只需要看一下cookie里面的sessionid就知道是来源了。在jsp中是jessionid这个值。

针对wx.request添加header

那么知道了原理,我们就可以手动模仿浏览器自动添加cookie这一步,那么app.js里面有一个onShow/onLaunch,在这步里面,我们可以使用一个wx.request去访问我们的后台,那么后台的服务器这时候是可以拿到第一个sessionid的,那么服务端将这个sessionid回复给我们,我们就可以记录下这个header。
首先在我们的app.js全局数据中添加header

  globalData: {
    userInfo: null,
    header: {
      'Cookie': ''
    }
  }

这里面可以放我们的cookie,然后请求服务端返回当前会话的sessionid
客户端代码:

wx.request({
          url: app.globalData.requestUrl,
          data: {
            code: res.code
          },
          success: function (res) {
            let ret = res.data;
            if (ret.status == 200) {
            // 添加到全局数据的header中
              app.globalData.header.Cookie = 'JSESSIONID=' + ret.data.sessionid;
            }
          }
        })

服务端代码:
ret.put("sessionid", request.getSession().getId());
很简单就能直接获得我们的id,这样子,我们就完成了header的获取

那么每次我们的wx.request,就要带上这个header
代码:

    wx.request({
      url: app.globalData.requestUrl,
      // header中添加我们预先放入全局数据中的header,完成session的手动添加,那么就完成了会话的设置
      header: app.globalData.header,
      method: 'GET',
      dataType: 'json',
      success: function(res){
        console.log(res.data.data.url)
        that.setData({
          captcha: res.data.data
        })
      }
    })

图片显示问题

因为有些时候可能需要验证码,而验证码是放到session中的,那么如果直接选择访问服务器返回的验证码地址,可能取出来的就是null了。

比如我们的服务器返回一个url,而这个url实际上是取session中的验证码来生成图片,那么可能就存在问题。

因此,这就是当浏览器禁用了cookie的时候,我们可以通过URL获得sessionid

对于java web来说,url;jessionid=就可以达到和设置header一样的效果,就能解决非request的session问题了

总结

两种办法:
1、针对wx.request,采用全局数据保存sessionid的方式,手动每次请求添加进请求体中
2、针对图片资源,采用url传session方式,将sessionid放入url,可以起到一样的效果

你可能感兴趣的:(微信小程序Session问题)