Cookie介绍-来自百度百科
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265[1] 。(可以叫做浏览器缓存)
Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。
Cookie在Android的应用
- 为了减轻服务端的压力,有时候在登录过后,服务端会为客户端生成一个cookie,当客户端想要获取登录后的信息,不必每次请求都携带用户名和密码,只需要带上cookie,当cookie超期时,会获取到相应的信心,提示用户重新进行登录
- cookie会有不安全性,有可能被截取,然后模拟登录状态获取信息
代码演示
- 模拟登录,获取cookie,抓的包模拟–
//登录按钮
public void login(View v) {
new Thread() {
public void run() {
try {
//创建HttpClient对象
DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
//创建httpPost对象,指定请求地址
HttpPost httpPost = new HttpPost(
"http://www.meirixue.com/api.php?c=login&a=index");
//创建集合的键值对
List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
//添加用户名和密码----这里的用户名大家可以下载每日学客户端注册一个--抓包抓的测试接口,用户名和密码不能给大家
parameters.add(new BasicNameValuePair("userName",
"xxxxxxxxxx"));
parameters.add(new BasicNameValuePair("password",
"xxxxxxxxxx"));
parameters.add(new BasicNameValuePair("dosubmit", "1"));
// 添加参数
httpPost.setEntity(new UrlEncodedFormEntity(parameters));
//执行请求
HttpResponse httpResponse = defaultHttpClient
.execute(httpPost);
int code = httpResponse.getStatusLine().getStatusCode();
//判断一下响应码
if (code == 200) {
//获取网络流
InputStream inputStream = httpResponse.getEntity()
.getContent();
//将流转换成字符串
String parseStream = StreamUtils
.parseStream(inputStream);
System.out.println("---" + parseStream);
// 获取cookie---这种方式是HttpClient专属方式,每种方式是不同的
CookieStore cookieStore = defaultHttpClient
.getCookieStore();
List<Cookie> cookies = cookieStore.getCookies();
//进行拼接--这里拼接根据公司是不同的,这里的拼接效果是 key=value;key=value;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < cookies.size(); i++) {
Cookie cookie = cookies.get(i);
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
if (!TextUtils.isEmpty(cookieName)
&& !TextUtils.isEmpty(cookieValue)) {
sb.append(cookieName + "=");
sb.append(cookieValue + ";");
}
}
// 存到文件中
SharedPreferencesUtils.saveString(MainActivity.this,
"cookie", sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
- 登录之后,获取到这个cookie并存储到本地,再获取一些个人信息时,携带者cookie去做请求
/**
* 查询课程信息--需要在登录结束之后,获取到的cookie并保存到本地之后,获取cookie信息,作为请求头
*
* @param v
*/
public void queryInfo(View v) {
new Thread() {
public void run() {
try {
//创建客户端对象
DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
//这个地址是进行个人数据的请求,前提是先完成了登录
HttpPost httpPost = new HttpPost(
"http://www.meirixue.com/api.php?c=notice&a=index");
// 添加cookie
httpPost.addHeader("Cookie", SharedPreferencesUtils
.getString(MainActivity.this, "cookie", ""));
HttpResponse httpResponse = defaultHttpClient
.execute(httpPost);
int code = httpResponse.getStatusLine().getStatusCode();
//如果请求成功,并且成功码是200代表是已经成功了,如果是205,代表未登录的状态
if (code == 200) {
InputStream inputStream = httpResponse.getEntity()
.getContent();
String parseStream = StreamUtils
.parseStream(inputStream);
System.out.println("---" + parseStream);
} else {
System.out.println("---" + code);
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
以上就是对Cookie的代码演示…是基于Android的HttpClient来做的模拟,如果想要从其他网络框架中使用,需要用其他方式
这篇文章就对Retrofit中使用cookie做了讲解
http://blog.youkuaiyun.com/zhiyuan0932/article/details/54318944