Android 实现 session 保持

转载 2016年08月30日 22:35:29

最近在开发项目的过程中,遇到 android 与 web 服务器要在同一 session 下通信的问题。先来了解一下 session 机制 和 session 的实现方式:


Session机制

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

当程序需要为某个客户端的请求创建一个 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

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

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

Cookie和Session有以下明显的不同点:

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

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

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

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



         /***************************** 以上为借鉴   <  华 丽 丽 的 分 割 线  >   以下为实践 *****************************/



最近的 Android 项目,使用的是 XUtils 中的 HttpUtils 来实现网络数据请求,用 post 方式,将 sessionid 保存在 cookie 中,发送给服务器。
做法是 第一次数据请求时 将获取到的 sessionid 的值保存在一个静态变量中,然后在第二次请求数据时,将这个 sessionid 放在 Cookie 中发送给服务器,服务器则是通过这个 sessionid 来识别究竟是哪个客户端在请求数据的, java 中这个 sessionid 的名字叫做 JSESSIONID (在 php 中这个 sessionid 的名字叫做 PHPSESSID)。java 中 sessionid 值的格式:JSESSIONID=AD5F5C9EEB16C71EC3725DBF209F6178,是键值对,不是单指值。


      
在 XUtils 中有一个 configCookieStore 用来设置请求中的 Cookie 对象,参数类型 org.apache.http.client.CookieStore,也就是说在第一次数据请求后,保存CookieStore类型cookie即可。

下面是创建的一个类,使用 静态变量 来实现 全局共享(也可以使用自定义 Application 里面增加变量):



  1. package com.chitty.easylottery.configs;  
  2.   
  3. import org.apache.http.client.CookieStore;  
  4.   
  5. /** 
  6.  * Created by Chitty on 2016/4/8. 
  7.  * E-Mail:532007154@qq.com 
  8.  */  
  9. public class MyCookieStore {  
  10.     public static CookieStore cookieStore=null;  
  11.   
  12.     public static String SESSIONID = null;  
  13. }  


每次网络请求时设置:


  1. final HttpUtils httpRequest = new HttpUtils();  
  2.   
  3. //第一次一般是还未被赋值,若有值则将 SessionId 发给服务器  
  4. if(null != MyCookieStore.SESSIONID){  
  5.     httpPost.setHeader("Cookie""JSESSIONID=" + MyCookieStore.SESSIONID);  
  6.     LogUtils.i("login","== setHeader === SESSIONID ====="+ MyCookieStore.SESSIONID);  
  7. }  
  8. httpRequest.configCookieStore(MyCookieStore.cookieStore);  


第一次网络请求(一般为登陆操作)成功后(即在 HttpUtils 的 onSuccess()方法中写 )设置:


  1. DefaultHttpClient dh = (DefaultHttpClient) httpRequest.getHttpClient();  
  2. MyCookieStore.cookieStore = dh.getCookieStore();  
  3. CookieStore cs = dh.getCookieStore();  
  4. List<Cookie> cookies = cs.getCookies();  
  5. for (int i = 0; i < cookies.size(); i++) {  
  6.     if ("JSESSIONID".equals(cookies.get(i).getName())) {  
  7.         MyCookieStore.SESSIONID = cookies.get(i).getValue();  
  8.         break;  
  9.     }  
  10. }  


即可实现 客户端 与 服务端 的 session 保持。


相关文章推荐

Android 中使用session机制保存用户信息

在web中,session机制大家已经再熟悉不过了,

java 后台和android 交互 保持session通讯

最近和app 对接登录时,需要做session保持通讯。这里整理记录下 主要实现是:用户登录成功后返回sessionID 给app ,app 上需要用户登录后才能操作的,在每次请求的时候把s...
  • phpfzh
  • phpfzh
  • 2017年05月19日 10:15
  • 642

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

前言 最近在开发项目的过程中,遇到Android与web服务器要在同一session下通信的问题。 一、Session与Cookie的共性与区别: ①、共性 Cookie和Sess...

Android客户端访问服务器保持SESSION会话的实现

大家在电脑上登录网上购物商城的时候购物,先进行登录,输入用户名密码,然后看到自己中意的商品就点开它的详情页面查看详细参数,然后决定买不买,在打开详情页面的时候,页面已经实现了跳转,那么第二个页面是服务...

android session的使用(图片验证码)

在上篇文章中学习了cookie和session,示例主要是在web中,今天学习下一些情况在android中的使用。 http://blog.csdn.net/androidxiaogang/arti...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

最近在开发项目的过程中,遇到android与web服务器要在同一session下通信的问题。 在解决问题前先回顾下Session与Cookie: Cookie和Session都为了...
  • zxc123e
  • zxc123e
  • 2014年12月03日 15:21
  • 36862

关于安卓请求服务器的session问题

安卓用http请求服务器的时候,第一次会请求会产生一个sessionID,服务器就会保存这个seesionID。我们只需要在安卓端把sessionID保存起来, 下次请求的时候设置http请求s...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

android实现session保持

sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,做...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 实现 session 保持
举报原因:
原因补充:

(最多只允许输入30个字)