博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android实现session保持
阅读量:6258 次
发布时间:2019-06-22

本文共 2982 字,大约阅读时间需要 9 分钟。

hot3.png

在最近写的一个Android中需要请求web服务器中的数据,有一个登录Activity,登录后会到MainActivity,这中间登录和MainActivity都需要请求php的jsonapi,所以要在网络请求中保持session的,研究了好半天才搞定。其实sesion在浏览器和web服务器直接是通过一个叫做name为sessionid的cookie来传递的,所以只要在每次数据请求时保持sessionid是同一个不变就可以用到web的session了,做法是第一次数据请求时就获取sessionid的值并保存在一个静态变量中,然后在第二次请求数据的时候要将这个sessionid一并放在Cookie中发给服务器,服务器则是通过这个sessionid来识别究竟是那个客户端在请求数据的,在php中这个sessionid的名字叫做PHPSESSID。下面贴下代码

import java.io.IOException; import java.io.UnsupportedEncodingException; 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.ClientProtocolException; 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 implements InetConfig { private DefaultHttpClient httpClient; private HttpPost httpPost; private HttpEntity httpEntity; private HttpResponse httpResponse; public static String PHPSESSID = null; public LVHttpClient() {    } public String executeRequest(String path, List
params) { String ret = "none"; try { this.httpPost = new HttpPost(BASEPATH + path); httpEntity = new UrlEncodedFormEntity(params, HTTP.UTF_8); httpPost.setEntity(httpEntity); //第一次一般是还未被赋值,若有值则将SessionId发给服务器 if(null != PHPSESSID){ httpPost.setHeader("Cookie", "PHPSESSID=" + PHPSESSID); } httpClient = new DefaultHttpClient(); } catch (UnsupportedEncodingException 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
cookies = mCookieStore.getCookies(); for (int i = 0; i < cookies.size(); i++) { //这里是读取Cookie['PHPSESSID']的值存在静态变量中,保证每次都是同一个值 if ("PHPSESSID".equals(cookies.get(i).getName())) { PHPSESSID = cookies.get(i).getValue(); break; } } } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ret; }}

其实web的原理都是一样的,基于http协议的,那么如果网站不是php做的话,那个叫做Sessionid的Cookie可能叫做别的了,就不是PHPSESSID了,而是叫做别的名字了,这个可能要具体情况去查了。

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

这里看到一个,顺便mark一下。

转载于:https://my.oschina.net/limbusnet/blog/86334

你可能感兴趣的文章
Python编码详解----转自AstralWind的Python字符串编码详解
查看>>
Linux之根文件系统
查看>>
可爱行销力量大:可爱的冰淇淋勺会让消费者想一直挖、一直挖
查看>>
Windows 2008 IIS7.0安装FTP教程
查看>>
jQuery--(6)遍历
查看>>
zabbix使用记录——监控windows进程
查看>>
我的友情链接
查看>>
智能指针
查看>>
DevExpress v17.2新版亮点——VCL篇(二)
查看>>
MyBatis学习总结(六)——调用存储过程
查看>>
UIKit动力学(一)
查看>>
Oracle 11g R2 视图
查看>>
servlet学习
查看>>
Android Parcelable接口
查看>>
Java冒泡排序
查看>>
深入理解Java虚拟机:JVM高级特性与最佳实践(三):内存分配与回收策略
查看>>
我的友情链接
查看>>
1.1 introduction
查看>>
Xcode的Architectures和Valid Architectures的区别
查看>>
Java -- Thread中start和run方法的区别
查看>>