android实现session保持简要概述及实现

其实sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,

感兴趣的你可以参考下本文或许对你有所帮助在最近写的一个Android中需要请求web服务器中的数据,有一个登录Activity,登录后会到MainActivity,这中间登录和 MainActivity都需要请求php的jsonapi,所以要在网络请求中保持session的,研究了好半天才搞定。

其实sesion在浏览器和 web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可 以用到web的session了,做法是第一次数据请求时就获取sessionid的值并保存在一个静态变量中,然后在第二次请求数据的时候要将这个 sessionid一并放在Cookie中发给服务器,服务器则是通过这个sessionid来识别究竟是那个客户端在请求数据的,在jsp中这个 sessionid的名字叫做JSESSIONID。下面贴下代码

package my.android;import java.util.List;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.CookieStore;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.cookie.Cookie;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.protocol.HTTP;import org.apache.http.util.EntityUtils;public class MyHttpClient {private DefaultHttpClient httpClient;private HttpPost httpPost;private HttpEntity httpEntity;private HttpResponse httpResponse;public static String JSESSIONID = null;public MyHttpClient() {}public String executeRequest(String path, List<NameValuePair> params) {String ret = "none";try {this.httpPost = new HttpPost(path);httpEntity = new UrlEncodedFormEntity(params, HTTP.UTF_8);httpPost.setEntity(httpEntity);// 第一次一般是还未被赋值,若有值则将SessionId发给服务器if (null != JSESSIONID) {httpPost.setHeader("Cookie", "JSESSIONID=" + JSESSIONID);}httpClient = new DefaultHttpClient();}catch (Exception e) {e.printStackTrace();}try {httpResponse = httpClient.execute(httpPost);if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {HttpEntity entity = httpResponse.getEntity();ret = EntityUtils.toString(entity);CookieStore mCookieStore = httpClient.getCookieStore();List<Cookie> cookies = mCookieStore.getCookies();for (int i = 0; i < cookies.size(); i++) {// 这里是读取Cookie['JSESSIONID']的值存在静态变量中,保证每次都是同一个值if ("JSESSIONID".equalsIgnoreCase(cookies.get(i).getName())) {JSESSIONID = cookies.get(i).getValue();break;}}}} catch (Exception e) {e.printStackTrace();}return ret;}}// 注意,使用摸拟器访问本地,ip使用10.0.2.2// Value 是实现了 NameValuePair接口的简单类public class helloandroidactivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                new Thread(){        public void run(){        MyHttpClient client = new MyHttpClient();        List<NameValuePair> list = new ArrayList<NameValuePair>();        list.add(new Value("id","2"));        client.executeRequest("http://10.0.2.2:8080/DetronVOIP/account/find", list);        }        }.start();    }}


其 实不只是Android程序,其他任何程序需要这么用的时候只需要在http协议请求header里头加上发送相应的SessionId就可以了。刚刚这 种方法是可以帮助理解sessionid的,其实还有一种方法如果更通用的话,就可以将刚刚所有的Cookie每次都发回到服务器端,也就可以解决 session保持的问题了,只是这样可能会稍微大些网络流量开销而已。

这里看到一个SessionId的本质,顺便mark一下。
SessionID的本质

一、客户端用cookie保存了sessionID
客 户端用cookie保存了sessionID,当我们请求服务器的时候,会把这个sessionID一起发给服务器,服务器会到内存中搜索对应的 sessionID,如果找到了对应的 sessionID,说明我们处于登录状态,有相应的权限;如果没有找到对应的sessionID,这说明:要么是我们把浏览器关掉了(后面会说明为什 么),要么session超时了(没有请求服务器超过20分钟),session被服务器清除了,则服务器会给你分配一个新的sessionID。你得重 新登录并把这个新的sessionID保存在cookie中。

在没有把浏览器关掉的时候(这个时候假如已经把sessionID保存 在cookie中了)这个sessionID会一直保存在浏览器中,每次请求的时候都会把这个sessionID提交到服务器,所以服务器认为我们是登录 的;当然,如果太长时间没有请求服务器,服务器会认为我们已经所以把浏览器关掉了,这个时候服务器会把该sessionID从内存中清除掉,这个时候如果 我们再去请求服务器,sessionID已经不存在了,所以服务器并没有在内存中找到对应的 sessionID,所以会再产生一个新的sessionID,这个时候一般我们又要再登录一次。

二、客户端没有用cookie保存sessionID
这 个时候如果我们请求服务器,因为没有提交sessionID上来,服务器会认为你是一个全新的请求,服务器会给你分配一个新的sessionID,这就是 为什么我们每次打开一个新的浏览器的时候(无论之前我们有没有登录过)都会产生一个新的sessionID(或者是会让我们重新登录)。

当 我们一旦把浏览器关掉后,再打开浏览器再请求该页面,它会让我们登录,这是为什么?我们明明已经登录了,而且还没有超时,sessionID肯定还在服 务器上的,为什么现在我们又要再一次登录呢?这是因为我们关掉浏览再请求的时候,我们提交的信息没有把刚才的sessionID一起提交到服务器,所以服 务器不知道我们是同一个人,所以这时服务器又为我们分配一个新的sessionID,打个比方:浏览器就好像一个要去银行开户的人,而服务器就好比银行, 这个要去银行开户的人这个时候显然没有帐号(sessionID),所以到银行后,银行工作人员问有没有帐号,他说没有,这个时候银行就会为他开通一个帐 号。所以可以这么说,每次打开一个新的浏览器去请求的一个页面的时候,服务器都会认为,这是一个新的请求,他为你分配一个新的sessionID。

更多相关文章

  1. Android使用Retrofit进行网络请求
  2. Android(安卓)Paging组件Demo
  3. 【安卓笔记】android客户端与服务端交互的三种方式
  4. android手机客户端上传文件,java servlet服务器端接收并保存到服
  5. Android(安卓)startActivityForResult的使用
  6. android从服务器下载文件(php+apache+win7+MySql)
  7. Android(安卓)手机配office365邮箱
  8. 13-7-13如何修改android的title
  9. 安卓9.0 http请求数据失败解决办法

随机推荐

  1. 自定义android的tab样式 《》
  2. Android(安卓)Studio 快捷键(2)
  3. AndroidManifest.xml设置程序安装的路径
  4. Android(安卓)Error: ShouldNotReachHere
  5. 软件安装:android studio安装以及操作手册
  6. android设置显示语言
  7. 【Android(安卓)Developers Training】 9
  8. android UI单位
  9. Android(安卓)tMeasureSpec 含义
  10. Android(安卓)TabHost设置setCurrentTab(i