一. 关于Cookie
一句话概括就是:cookie就是一系列的键值对组成的字符串
二. Cookie的最常用场景
登录状态的判定等
前言
以前看过不少关于cookie的文章,至于写的好坏不做评价,反正我是没看多明白如何操作cookie,也有可能是个人水平不行,无法理解别人的讲解。最近一直在学习后台开发,加上个人一直在做移动端开发,之前一直不明白的地方现在都豁然开朗了,于是打算写这篇文章了。
如果是在浏览器中,浏览器会管理cookie,不用人为干涉,但是在移动端开发时就不同了,需要手动传递cookie,和服务端交流。如果服务器按照传统的页面开发实现实现接口,那么移动客户端就要实现像浏览器一样操作cookie。
1.想明白如何操作cookie,就必须明白cookie是什么,以及cookie是如何传递的
请求参数:
返回参数:
a)先看响应,返回数据的头中有一系列的key为Set-Cookie的键值对
先说第一个Set-Cookie:JSESSIONID
这时用来实现会话的,如果是第一次访问,请求的参数中没有这个参数,服务器会生成一个JSESSIONID放在响应头中,下次在访问的时候,浏览器就会把这个参数带上
第一幅图中的Cookie中就有JSESSIONID,这说明已经不是第一次访问了
而第二幅图中返回的头中有JSESSIONID,说明这次的请求是第一次请求
这两幅图并不是同一次的请求和响应
第二幅图中的其它Set-Cookie
都是服务器返回的其它键值对,浏览器不用关心它们是什么意思,下次访问的时候直接在返回给服务端就是。
其中第二个Set-Cookie长得与其它不太一样,多了一个Expires
,这个是表示这个键值对过期时间,如果过期了,下次请求浏览器就不会把这个键值对带过去
b)再看请求:
请求的头中Cookie就是把所有的服务器之前返回的Cookie以分号;
进行分割,拼成了一个字符串传给了服务器。
例如之前服务器响应了JSESSIONID、akey、bkey、ckey四个键值对,再次访问的时候,浏览器就会把没有过期的cookie再次发送给服务器。
上面提到的akey设置了过期时间,如果akey过期了,那么请求中就不会把akey加到Cookie中。只会发送JSESSIONID、bkey、ckey
c)Cookie的识别
当我们访问的路径地址中包含此cookie的path,则携带。例如:http://localhost:8080/day11/hello,就会把下图中的ckey带着
path会有一个默认值,过期时间如果不设置,默认就是关闭浏览器时过期
2.利用HttpURLConnection操作Cookie,模拟浏览器
a)获取Cookie
getHeaderFields()
方法,返回结果是Map<String,List<String>>
类型
HttpURLConnection httpConn = null;
...
Map<String,List<String>> cookies = httpConn.getHeaderFields();
List<String> setCookies = cookies.get("Set-Cookie");
这样就可以吧所有的Set-Cookie
字段都拿到。存起来,至于怎么存,无所谓,自己决定
b)携带Cookie
// 把你存的Cookie键值对用分号分隔,拼成一个字符串,是不是需要把所有Cookie都拼进来,看实际情况
// 例如你有10个键值对,有3个过期的,肯定不要了,至于过期判定,前面有说到,这个就需要你按照规定的格式判断出来。还有两个可能是这次请求不需要的,也可以不带,为了简单可以直接把所有没过期的都带上,省事,服务器爱用不用。
String cookie = "JSESSIONID=xxx;key1=value1;key2=value2"
conn.setRequestProperty("Cookie", cookie);
这样就可以传给服务器,就是在和么简单。
c)会话保持
拿到的Cookie中如果有JSESSIONID就存起来,每次请求都带着,这样就能实现保持会话,如果某次请求服务器告诉你需要重新新登录了,那么你就把保存的JSESSIONID删了,并且请求中不携带JSESSIONID,服务器会再给你一个新的,保存下来以后继续用即可。