一、背景

  最近在做一个面向三端【H5、IOS、安卓】的短信验证码登录接口。发送短信验证码时,服务端通过 session 保存验证码的值。登录时,从 session 获取验证码和用户输入的验证码

相比较。在这过程中,H5 端 session 的设置、读取都没有问题。但是 IOS 、安卓端可以正常设置 session 值,但是在登录时,读取的 session 值为空,导致业务逻辑异常中断。

二、原因

  1、PC 端多个请求,会使用同一个 PHPSESSID ;

  2、移动端【IOS 安卓】多个请求,会使用不同的PHPSESSID。比如发送验证码时的 PHPSESSID = t5arr13hh352gaekn255jvrk36,登录时的 PHPSESSID = 44jh1hgcc07v0bi07i652vbnv1;

因为 PHPSESSID 的不一致,导致了移动端【IOS 安卓】不能正常读取 session 值。

三、参考解决方案

  移动端人为设置 PHPSESSID ,并保持有业务管理的接口中的 PHPSESSID 一致即可。

四、Session 原理

  提到session,大家肯定会联想到登录,登录成功后记录登录状态,同时标记当前登录用户是谁。功能大体上就是这个样子,但是今天要讲的不是功能,而是实现。通过探讨session的实现方式来发掘一些可能你之前不知道的有趣的事情。

  为了记录session,在客户端和服务器端都要保存数据,客户端记录一个标记,服务器端不但存储了这个标记同时还存储了这个标记映射的数据。好吧,还是说点白话吧,在客户端记录的其实是一个sessionid,在服务器端记录的是一个key-value形式的数据结构,这里的key肯定是指sessionid了,value就代表session的详细内容。用户在做http请求的时候,总是会把sessionid传递给服务器,然后服务器根据这个sessionid来查询session的内容(也就是上面说到的value)。
现在我们重点关注一下sessionid,他是今天问题的关键所在。sessionid在客户端(http的客户端一般就是指浏览器了)是存储在cookie中,当然也有例外(书本上肯定会提到也有保存在url中的)。

  我们通过一个例子来阐述一下这个sessionid在session处理时的作用。首先假定这么一个场景,我们有一个cms(content
management system,内容管理系统),这个应用有一个后台,用户必须登录才能进入后台进行文章发表等操作。首先是登录流程,用户在浏览器输入用户名、密码,点击登录,浏览器会将用户名密码提交到服务器程序进行处理;服务器验证用户名、密码正确后,会返回登录成功信息,并且会修改服务器端的session内容,比如我们将用户ID写入session中,为了方便存储这些session的内容会被序列化成字符串或者二进制保存在文件或者数据库中,这时候大多数情况下服务器在对当前的http请求进行响应时,会返回一个新的sessionid要求浏览器写入本地cookie中,对应的返回的http响应头部信息应该会是是这个样子的:set-cookie:PHPSESSID=xxxxxxx,浏览器解析到这个头之后就会在当前生成一个cookie关联当前的域名。

  接着用户登录后台进行发表文章操作,登录用户填写文章的标题、内容,然后点击发送。这时候浏览器会生成一条到服务器的http请求,注意这个请求的头部会将存储sessionid的cookie内容发送过去,也就是说请求的http头部信息中应该会有这么一段数据:cookie:PHPSESSID=xxxxxxx;other_cookie_name=yyyyyy;服务器接收到这个http请求之后,解析到cookie存在,且cookie中存在PHPSESSID这个cookie名字,然后就将PHPSESSID的值(也就是sessionid的值)取出来,根据这个PHPSESSID查询服务器上有没有对应的session内容,如果有则将其对应的值取出来进行反序列序列化(也就是将其转成编程语言中的一个数据结果,比如在php中会得到一个$_SESSION数组,在j2ee中会得到类型为javax.servlet.http.HttpSession),方便在程序中进行读取,最终服务器认定session中储存的值存在,并且从反序列化得到的对象中读取到了用户ID属性,然后就往cms数据库的文章表中插入了一条数据,最终返回http响应,告诉浏览器操作成功了。

最新文章

  1. [html]head区域编写规范
  2. K-近邻算法
  3. 每天一个linux命令(52):ifconfig命令
  4. Windows Azure Virtual Machine (33) Azure虚拟机删除重建
  5. js删除数据的几种方法
  6. ZOJ 1111 Poker Hands --复杂模拟
  7. LogBack配置详解(一)
  8. leecode Binary Tree Level Order Traversal II java
  9. 四种方法解决DIV高度自适应问题
  10. Get Form type using javascript in CRM 2011
  11. Android Studio调试手机或者安装APK的时候出现install failed test only
  12. python全栈开发day110-Flask基础语法
  13. php+redis实现消息队列
  14. kubenets installation--ranchor-mesos
  15. Images之Dockerfiles
  16. fee photo
  17. Android中SharedPerforences的简单使用示例 --Android基础
  18. 在python中while
  19. 3D CNN for Video Processing
  20. 面试题22:有序数组生成不同结构BST

热门文章

  1. python 图片格式转换png转jpg,如何利用python给图片添加半透明水印
  2. css3实现左侧固宽,右侧随着屏幕,右侧随着屏幕变化而变化
  3. docker vim右键进入visual模式无法粘贴
  4. js实现字符串切割并转换成对象格式保存到本地
  5. 微信小程序开发——base64位图片显示问题
  6. 如何用java代码写一个堆栈
  7. Python3.7安装(解决ssl问题)
  8. iOS开发应该知道的7个编程概念
  9. Python爬虫笔记技术篇
  10. swoole实战1-初识swoole