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机制大家已经再熟悉不过了,
  • wanglanchun0
  • wanglanchun0
  • 2014年04月05日 16:26
  • 3592

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

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

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

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

Android 实现 session 保持

最近在开发项目的过程中,遇到 android 与 web 服务器要在同一 session 下通信的问题。先来了解一下 session 机制 和 session 的实现方式: Session机制 ...
  • CHITTY1993
  • CHITTY1993
  • 2016年04月10日 17:35
  • 3088

Android 通过httpclient请求web服务器,并解决用户登录session保持

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

Android终端APP访问服务器保持在同一个session的方式

在实际开发中,会有这样一个问题: WEB应用为了做到安全性更好,会将登录成功的用户信息保存在session中,并且使用过滤器进行登录拦截。只有登录后的用户才能继续操作,没有登录的用户会提示他去登录。...
  • muyi_amen
  • muyi_amen
  • 2016年12月09日 17:04
  • 4683

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

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

客户端(ios和android)与服务器之间的会话管理(session和cookie)

项目前提: 客户端访问服务器接口需要携带根据username和password生成的access_token, 即访问所有(除获取access_token的接口)都要携带access_token,...
  • sidongxue2
  • sidongxue2
  • 2015年01月21日 21:54
  • 2957

android实现session保持【以及web登陆保持】

对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可。 但是为了保持登录的状态(在各个Activity之间切换时要让网站知道用户一直是处于登录的状态)就需要进行coo...
  • nolouch
  • nolouch
  • 2014年07月07日 15:10
  • 2874

Android使用Session

  • 2013年06月04日 16:02
  • 951B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 实现 session 保持
举报原因:
原因补充:

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