Android 实现 session 保持


最近在开发项目的过程中,遇到 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 里面增加变量):



package com.chitty.easylottery.configs;

import org.apache.http.client.CookieStore;

/**
 * Created by Chitty on 2016/4/8.
 * E-Mail:532007154@qq.com
 */
public class MyCookieStore {
    public static CookieStore cookieStore=null;

    public static String SESSIONID = null;
}


每次网络请求时设置:


final HttpUtils httpRequest = new HttpUtils();

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


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


DefaultHttpClient dh = (DefaultHttpClient) httpRequest.getHttpClient();
MyCookieStore.cookieStore = dh.getCookieStore();
CookieStore cs = dh.getCookieStore();
List<Cookie> cookies = cs.getCookies();
for (int i = 0; i < cookies.size(); i++) {
    if ("JSESSIONID".equals(cookies.get(i).getName())) {
        MyCookieStore.SESSIONID = cookies.get(i).getValue();
        break;
    }
}


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





  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值