前言

最近在开发项目的过程中,遇到Android与web服务器要在同一session下通信的问题。

一、Session与Cookie的共性与区别

①、共性

Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。

Session可以用Cookie来实现,也可以用URL回写的机制来实现。

②、区别

1)Cookie将状态保存在客户端,Session将状态保存在服务器端;

2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。

3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是不同用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;

4)就安全性来说:当你访问一个使用session 的站点,同时在自己机器上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。

二、Session机制


1)Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

2)当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

三、Session的实现方式


1 ) 使用Cookie来实现

服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。

当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。

 2 )使用URL回显来实现

URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带给服务器。如果直接在浏览器中输入url来请求资源,Session是匹配不到的。

Tomcat对 Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用 response.encodeURL() 。

四、总结

回顾完Session和Cookie,那么问题来了,为什么手机端与服务器交互没有实现在同一session下

1)原因很简单,就是因为android手机端在访问web服务器时,没有给http请求头部设置sessionID,而使用web浏览器作为客户端访问服务器时,在客户端每次发起请求的时候,都会将交互中的sessionID:JSESSIONID设置在Cookie头中携带过去,服务器根据这个sessionID获取对应的Session,而不是重新创建一个新Session(除了这个Session失效)。

以Java.NET.HttpURLConnection发起请求为例:

获取Cookie:
URL url = new URL(requrl);HttpURLConnection con= (HttpURLConnection) url.openConnection();
// 取得sessionid.
String cookieval = con.getHeaderField("set-cookie");
String sessionid;
if(cookieval != null) {
sessionid = cookieval.substring(0, cookieval.indexOf(";"));
}
//sessionid值格式:JSESSIONID=AD5F5C9EEB16C71EC3725DBF209F6178,是键值对,不是单指值
发送设置cookie:
URL url = new URL(requrl);
HttpURLConnectioncon= (HttpURLConnection) url.openConnection();
if(sessionid != null) {
con.setRequestProperty("cookie", sessionid);
}

只要设置了sessionID,这样web服务器在接受请求的时候就会自动搜索对应的session了,从而保证了在同一会话Session。

以下是我个人总结出来的Http请求的代码:

private static String session_id = null;public static String httpRequest(String requrl) {String result = null;// 请求返回的字符串try {URL url = new URL(requrl);HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setRequestMethod("GET");if (session_id != null) {con.setRequestProperty("Cookie", session_id);//设置sessionid}InputStream is = con.getInputStream();String cookieval = con.getHeaderField("Set-Cookie");if (cookieval != null) {session_id = cookieval.substring(0, cookieval.indexOf(";"));//获取sessionidL.w("SESSION", "session_id=" + session_id);}ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) > 0) {bos.write(buffer, 0, len);}bos.flush();is.close();byte[] resultbyte = bos.toByteArray();result = bos.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}


注:如果你使用了OKHttp的开发框架,那么在下一章Android OKHttp的使用心得中会有介绍遇到session过期问题如何使用OKHttp保持session的会话

参考

http://blog.csdn.net/zxc123e/article/details/41698027

http://blog.csdn.net/yaochangliang159/article/details/50433682

Android客户端与服务器端交互,如何保持session回话相关推荐

  1. android客户端与服务器端交互 如何保持session

    最近在开发项目的过程中,遇到android与web服务器要在同一session下通信的问题. 在解决问题前先回顾下Session与Cookie: Cookie和Session都为了用来保存状态信息,都 ...

  2. Android 客户端与服务器端交互实现登录功能

    思路: 安卓客户端输入账号和密码,使用 okHttp 向服务器端发送请求并传递输入的账号和密码,服务器端的登录接口查询数据库,判断是否能登录成功,然后返回给客户端JSON字符串,客户端使用Gson解析 ...

  3. Android 客户端与服务器端进行数据交互(一、登录服务器端)

    概要 安卓APP要实现很多功能(比如登录注册.发表评论等)时都必须要使用到网络数据交互.所以在学习了这部分内容后,就将其以最常见的登录过程为例整理出来,也方便跟我一样的新手能迅速学习上手. 预期效果图 ...

  4. 封装一个类搞定90%安卓客户端与服务器端交互

    本实例封装了一个处理安卓客户端与服务器端交互的几个方法,对于中文乱码问题本实例也找到了解决方案.本例可以处理的场景如下: 1.与服务器端交互json数据. 2.Get方式与服务器端交互数据. 3.Po ...

  5. 浅析Java web程序之客户端和服务器端交互原理

    原文链接: https://www.iteye.com/topic/470019 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考 ...

  6. java 实现 web 客户端_Java web客户端和服务器端交互的原理

    Java web客户端和服务器端交互的原理 其实HTTP客户端和服务器端的交互原理很简单:即先是浏览器和服务器端建立Socket无状态连接,也就是短连接,然后通过IO流进行报文信息(这个报文是严格遵循 ...

  7. 一个简单的Android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...

  8. Android客户端与服务器端socket通讯

    Android客户端与服务器端的Socket通讯: socket通讯依赖IP地址和端口号,每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 服务器端代码: 实例化主类, ...

  9. java基于http协议客户端与服务器端的交互,通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分...

    经 常看到HTTP客户端与服务器端交互原理的各种版本的文章,但是专业术语太多,且流程过于复杂,不容易消化.于是就按照在 Servlet 里面的内容大致做了一些穿插.本来 连 Tomcat 容器 和 S ...

最新文章

  1. 密码学中经典算法及应用
  2. 报名 | 清华大学大数据能力提升项目开始报名啦!(2021秋)
  3. 中序遍历的非递归算法
  4. python画旺仔代码_美术生把旺仔牛奶画成抖音网红,看清画的是谁,网友:确认过眼神...
  5. Intel Realsense D435 测试摄像头在不同曝光值下的帧生成时间(防止曝光时间过长导致fps下降)auto_exposure_priority(没成功)
  6. 北语18春《计算机网络技术》作业4,北语18春《计算机网络技术》作业4
  7. jQuery常用的全局方法源码
  8. “韩国泡菜源于中国”说引韩国教授抗议,要求修改词条,百度百科回应...
  9. [拇指飞动]读《程序员修炼之道:从小工到专家》
  10. es6 let和const命令(1)
  11. 遇到的bug及解决方法,持续更新
  12. SylixOS SylixOS CAN总线驱动之三
  13. 几款查看dll和exe信息的小工具
  14. 2022年PMP考试模拟题1(含答案解析)
  15. [辅助工具] 【羽睿】Proxmark3 Easy Gui 4.0 5.0 5.1加强版 PM3GUI_X稳定优化版
  16. 充电w数测试软件,充电功率检测(cn.nowtool.battery) - 1.3.0 - 应用 - 酷安
  17. POJO、PO、DTO、DAO、BO、VO需要搞清楚的概念
  18. 上线啦,PP.io!
  19. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明
  20. PHP日期转换为时间戳

热门文章

  1. linux图片切割,从相册截图 - Android大图片裁剪终极解决方案_Linux编程_Linux公社-Linux系统门户网站...
  2. matlab并联负荷模块,Matlab-SimPowerSystems-Elements模块使用说明
  3. OVS搭建虚拟机全过程(四十五)
  4. linux存储--文件描述符以及file结构体(一)
  5. mfc将文件内容引入编辑框_南开大学黄津辉教授团队联合加拿大麦克马斯特大学Ravi教授团队发表微型MFC水质传感器实际废水检测适用性的研究...
  6. Python自动化开发学习15-css补充内容
  7. 在VMware ESXI 6.5创建虚拟机
  8. 【随笔】游戏程序开发必知的10大基础实用算法及其讲解
  9. [Android] Android颜色对应的xml配置值
  10. 不能使用 '';文件已在使用中。