zoukankan      html  css  js  c++  java
  • 理解session及微信小程序使用session

    session介绍

    由于Http是无状态的协议,所以服务端需要记录用户的状态时,就需要某种机制来识别具体的用户,实现这个机制的方式就是session。

    典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。

    那么服务器端是如何识别特定的客户的?

    每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。

    下次请求时会带上sessionId:

    实现Session跟踪需要用到Cookie,如果客户端的浏览器禁用了 Cookie 怎么办?


    一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

    实现方式

    服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。

    在程序中第一次调用request.getSession()方法时就会创建一个新的Session,可以用isNew()方法来判断Session是不是新创建的。

    session对象默认30分钟没有使用,则服务器会自动销毁session。

    当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。

    HttpSession session = request.getSession();
    //手工调用session.invalidate方法,摧毁session
    session.invalidate();
    

    微信小程序使用session时注意的问题

    微信小程序不能保存Cookie,导致每次wx.request到服务端都会创建一个新的会话(传过去的sessionid会变化),小程序端就不能保持登录状态了。

    一个比较简单的办法就是把服务端response的Set-Cookie中的值保存到Storage中。

    登录成功后,添加Cookie:

    wx.setStorageSync("cookieKey", res.header["Set-Cookie"]);
    

    然后调用接口时,在header中加入:

    'Cookie': wx.getStorageSync('cookieKey')
    

    接口调用由之前的:

    wx.request({
      url: 'test.php',
      data: {
        x: '',
        y: ''
      },
      header: {
        'content-type': 'application/json' 
      },
      success (res) {
        console.log(res.data)
      }
    })
    
    

    变为:

    wx.request({
      url: 'test.php', 
      data: {
        x: '',
        y: ''
      },
      header: {
        'content-type': 'application/json' ,
        'Cookie': wx.getStorageSync('cookieKey')
      },
      success (res) {
        console.log(res.data)
      }
    })
    
    

    欢迎访问:

    易水寒的博客

  • 相关阅读:
    语录
    Python 自动化Web测试
    HTTP监视网络
    网络端口的转发和重定向
    [翻译]对为Microsoft Robotics Studio的设计做贡献感兴趣?
    [翻译]谈话记录:介绍Microsoft Robotics Studio
    [视频]名家讲坛ASP.NET之父Scott Guthrie[上海站]
    如何使用AJAX RoundedCorners Extender控件(视频字幕)
    给SlideShowExtender增加链接
    delphi7调用c#写的webservice(.net2.0)
  • 原文地址:https://www.cnblogs.com/liuyj-top/p/12910365.html
Copyright © 2011-2022 走看看