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)
}
})

欢迎访问:

易水寒的博客

最新文章

  1. Mono 3.2.7发布,JIT和GC进一步改进
  2. Jquery、简单的下拉列表、网页左部导航菜单
  3. ubuntu 安装与开始学习
  4. JavaScript 语句
  5. [转]Unity 3D旋转矢量方向及二维平面基于一点选择另一点(Rotate a Vector3 direction & Rotate a point about another point in 2D )
  6. 如何用DOS 链接mysql
  7. Delphi 调试 通过BreakPoint
  8. 本地phpstudy时常停机连接失败,php.ini文件中9000端口问题
  9. sublime 基本的配置
  10. kubernetes进阶之三:Pod
  11. 帝国cms中当调用当前信息不足时,继续取其他数据
  12. python与java的猜拳游戏
  13. (网页)javascript该如何学习?怎么样才能学好?
  14. Android学习之基础知识十四 — Android特色开发之基于位置的服务
  15. 使用JAVA API 解析ORC File
  16. BZOJ.4946.[NOI2017]蔬菜(贪心 离线)
  17. Linux init 0-6 启动级别
  18. CentOS 7.4 yum安装LAMP环境
  19. [iOS]UIDynamicAnimator动画
  20. java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

热门文章

  1. 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】
  2. 网络流--最大流--HDU 3549 Flow Problem
  3. Spring Framework 之AOP
  4. mybatis添加信息自动生成主键
  5. crontab自动启动小任务例子(每一分钟将当前日期打入一个文件)
  6. 使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题
  7. ubuntu上lib-ace库安装编译
  8. 用Stream流轻易的收集数据
  9. 如何为Linux服务器添加磁盘
  10. Android将库导入到build.gradle