我们进行web开发的时候,一般使用cookie或session来保存用户的登录状态,通过检查cookie或session的数据来验证用户是否具有对某些需要登录的页面的访问权限,这一切都是通过浏览器来完成,这是b/s架构,但是,假如客户端是移动应用端,那该怎么办?因为这是c/s架构,无法使用使用cookie或session来检验用户的状态,此时的情况就好像浏览器禁用了cookie。

庆幸的是,这是有解决方法的,在禁用cookie的情况下,可以通过query_string来传递session_id,即在app发送登录请求后,服务器端可以通过传递session_id到app,然后app保存session_id在移动设备上,在那些需要登录访问权限的功能,每一次交互请求附带参数session_id,传送到服务器端,再由服务器端检查session_id的合法性来确定该用户是否已登录。

以下是一个简单的移动开发示例,并没有使用原生的,而是使用appcan来构建app:

1. app登录请求:

  1. var url = 'http://127.0.0.1:8080/index.php?act=login&email=aa@qq.com&pwd=123456';
  2. $.getJSON(url,function(res){
  3. if(res.ok == 'yes'){
  4. var storage = window.localStorage;
  5. if(storage) storage.setItem('sid',res.session_id);
  6. }else{
  7. uexWindow.toast(0, 5, '登录失败!', 4000);
  8. return;
  9. }
  10. }, 'json',null, 'POST', '', '');

2. app请求用户信息:

  1. var sid = '';
  2. var storage = window.localStorage;
  3. if(storage) sid = storage.getItem('sid');
  4. var url = 'http://127.0.0.1:8080/index.php?act=uinfo&session_id='+sid;
  5. $.getJSON(url,function(res){
  6. if(res.ok == 'yes'){
  7. var uname = res.username;
  8. uexWindow.toast(0, 5, '用户名:'+uname, 4000);
  9. return;
  10. }else{
  11. uexWindow.toast(0, 5, '请先登录!', 4000);
  12. return;
  13. }
  14. }, 'json',null, 'POST', '', '');

3. 服务器端php响应请求[index.php]:

  1. <?php
  2. /**
  3. * User: wudiweb.com
  4. * app与服务器端简单示例
  5. */
  6. header("Content-Type: text/html; charset='utf-8'");
  7. session_start();
  8. $act = $_REQUEST['act'];
  9. $result = array('ok' => 'yes');
  10. if($act == 'login'){
  11. $email = $_REQUEST['email'];
  12. $pwd = $_REQUEST['pwd'];
  13. if($email == 'aa@qq.com' && $pwd == '123456'){
  14. $result['session_id'] = session_id();
  15. }else{
  16. $result['ok'] = 'no';
  17. }
  18. }elseif($act == 'uinfo'){
  19. $session_id = $_REQUEST['session_id'];
  20. if($session_id == session_id()){
  21. $result['username'] = 'Wudiweb';
  22. }else{
  23. $result['ok'] = 'no';
  24. }
  25. }
  26. echo json_encode($result);
  27. exit;

注意,这只是一个简单的用法,如果你认为不够完善,可以在此基础上进行扩展,例如加密session_id等。

开发移动app与服务器端session的状态管理与交互的更多相关文章

  1. 简简单单的Vue3(插件开发,路由系统,状态管理)

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...

  2. 小程序全局状态管理,在页面中获取globalData和使用globalSetData

    GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex.redux全局状态管理的解决方案,但是在一个完整的项目中各组件 ...

  3. vuex 状态管理 通俗理解

    解释:集中响应式数据管理,一处修改多处使用,主要应用于大中型项目. 安装: 第一:index.js:(注册store仓库) npm install vuex -D // 下载vuex import V ...

  4. python 全栈开发,Day129(玩具开机提示语,为多个玩具发送点播,聊天界面,app录音,app与服务器端文件传输,简单的对话)

    一.玩具开机提示语 先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.2.zi ...

  5. 服务器端Session和客户端Session(和Cookie区别)2

    https://blog.csdn.net/java_faep/article/details/78082802 我们可以得出如下结论: 关闭浏览器,只会是浏览器端内存里的session cookie ...

  6. 服务器端Session和客户端Session(和Cookie区别)

    Session其实分为客户端Session和服务器端Session. 当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识.SessionID是一个由24个字符组 ...

  7. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. 使用Docker开发NodeJs APP

    英文版原文地址 这是两篇连载文章的第一篇,讲解了如何使用 Docker 替代 Vagrant 开发基于 Express 框架的NodeJs App的部分细节.不过,这次要增加点难度:我们要使用 con ...

  9. UWP开发:APP之间的数据交互(以微信为例)

    目录 说明 UWP应用唤醒方式 跟微信APP交互数据 APP之间交互数据的前提 说明 我们经常看到,在手机上不需要退到桌面,APP之间就可以相互切换,并且可以传递数据.比如我在使用知乎APP的时候,需 ...

随机推荐

  1. oracle 空表无法导出

    1.执行该语句   select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;  ...

  2. IOS thread1:exc_bad)access(code=exc_1386_gpflt)错误

    这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象(Zombie Objects)来定位问题: 在Xcode的菜单: Product->Scheme->Edi ...

  3. 学习总结 java Iterator迭代器练习

    package com.hanqi.jh; import java.util.*; public class Text3 { public static void main(String[] args ...

  4. Android基础总结(7)——异步消息处理

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...

  5. MFC TOOLBAR

    m_imagelist.Create(,,ILC_COLOR24|ILC_MASK,,); CBitmap bmp; ;i<;i++) { int a= bmp.LoadBitmapW(IDB_ ...

  6. .NET的三种缓存(页面缓存,控件缓存,自定义缓存)

    BLL.Area bll = new BLL.Area(); protected void Page_Load(object sender, EventArgs e) { if (Cache[&quo ...

  7. ASP.NET MVC 开源项目学习之ProDinner (二)

    下面我们来看第二层:Data   这一层相对来说是对Core层的具体实现了. 从命名可以看出来,这和数据库相关. 1.Db.cs CodeFirst模式的本地数据库类,继承了DbContext. pr ...

  8. SQL常用日期转换

    0   或   100   (*)     默认值   mon   dd   yyyy   hh:miAM(或   PM)       1   101   美国   mm/dd/yyyy       ...

  9. Lamp源码包安装实录

    Lamp源码包安装实录 附件中是安装步骤,下载站点里包含视频(http://down.51cto.com/data/460776) 本文出自 "李晨光原创技术博客" 博客,请务必保 ...

  10. 【Spring 1】Spring简介

    一.Spring简介 首先,Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开 ...