在最近写的一个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<NameValuePair> 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<Cookie> 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保持的问题了,只是这样可能会稍微大些网络流量开销而已。
这里看到一个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。
相关推荐:
ChatGPT桌面版无法加载?快速解决方案及常见问题解析,ai媚眼
AI提取文章重要内容:让信息抓取更高效、更精准,松鼠ai 教学
seo需要会什么技术呢,seo需要会什么技术呢知乎 ,红色框ai
AI人工智能文章生成平台,释放创作无限可能
为什么seo对企业重要,seo对企业进行网络营销的价值 ,ai李沁换脸鲍鱼
用AI征文工具,轻松创作出精彩文章!
GPT在什么时候被人熟知的?从技术突破到广泛应用的背后故事,ai商业新思维ai课程
seo要懂些什么软件,seo常用软件 ,ai写作网站网址大全
SEO希望:如何通过SEO优化实现网站突破,迈向成功之路,品牌网站推广软件
OpenArtAI如何进入:数字艺术的未来之门,分析海报ai
AI通过算法和数据生成的作品:科技与艺术的跨越,带来无限创意可能,ai优化程序
ChatGPT网页打不开?快来看看这些解决办法,轻松恢复正常访问!,ai金色包装
怎样利用AI写文章,轻松提升写作效率
用AI批量下载工具,高效管理你的文件和资源
ChatGPT已识别但不可用?揭秘背后原因与解决方案!,小狸ai和斑马ai语文
SEO要不,来看看如何通过SEO优化提高网站流量和曝光度,seo 获客技巧
SEO文案:如何通过巧妙布局提升网站排名,吸引更多流量,娄底网站建设工作文案
AI人工智能:开发与应用的必备软件推荐
SEO优化:让你的网站在竞争中脱颖而出,临沧seo代理
为什么“搜狗不收录”会成为企业SEO的新挑战?,烤肉店的线下营销与推广
ChatGPT页面空白无法登录?如何解决这一困扰?,温州ai字幕生成
优化型网站:提升企业竞争力的必备利器,重庆网站推广工作如何
ChatGPT为什么打不开?背后原因与解决方案,慧ai写作
SEO手段:提升网站流量的制胜法宝,idc网站怎么推广
“扩写AI”-引领写作革命,开启智能创作新时代,dede seo 标题如何填写
SEO子-为你的网站注入流量的秘密武器,麻城网站网址优化
中外链:打通全球流量的桥梁,提升网站排名与流量的双重保障,行业网站建设思路
UCMS:引领智慧医疗新时代,打造数字化健康未来,推广工作谈营销
为什么越来越多的人选择在知乎发布文章?这里面的机会你可能还没发现!,潍坊关键词排名提升
ChatGPT,您的银行卡被拒绝了?别慌,这些方法帮您快速解决问题!,ai给那个标声调
SEO确实是企业增长的关键,这些技巧让你走在行业前沿,山东网站建设信息
为什么说seo重要,为什么说seo重要一点 ,中通智能ai是什么意思
AI助手推进:智能化时代的企业革命,ai改变图片颜色
SEO表格:优化网站排名的秘密武器,大数据推广营销费用多少
怎么降低文章的AI生成率:打造更真实、更有价值的内容
ChatGPT无法加载?检查您的网络设置并尝试重启ChatGPT,助您畅享无障碍智能对话体验,ai记录人
优化百:开启数字时代的智能营销新时代,湘潭seo优化报价表
AI免费文章生成器:轻松创作高质量内容的终极工具
SEO元素-提升网站排名的核心要素,推广分成网站有哪些
智能AI写作生成:如何借助人工智能提升创作效率与质量
seo用什么论坛引流,seo引流方法 ,ai写作续写神器
企业营销:如何在竞争激烈的市场中脱颖而出,美装网站Seo优化
SEO爱站:提升网站排名,赢得流量的秘密武器,优化网站设计价格多少
SEO要求:如何优化网站提升搜索引擎排名,助力企业获取更多流量,鹤山区网站运营推广
ChatGPT无法加载?检查您的网络设置并尝试重启,轻松解决连接问题!,ai制作艺术字
SEO开发:数字营销的核心驱动力,园区网站建设
自动写文章的AI,提升效率的创作利器
什么是seo寄生虫,寄生虫seo原理 ,AI 疫
SEO关键词推广软件官网-助力企业实现高效精准的网络营销,圈圈ai
ChatGPT页面空白不乏登录:让你秒变职场高手与生活智囊,百度ai 腾讯ai