Cookie配置,及Http过程对话


一、Cookie

1.1 Cookie与token

cookie最初是解决http连接无状态的产物,用于客户端和服务端共同维护一些状态数据。cookie会被附加到http请求中,
开发者不需要做额外的维护和支持。
使用cookie来维持登录态,在实际实现过程中,是在cookie中添加一个token来维持一个登录态。
而token通常是验证后的凭证,免除在一定时间内的重复验证,token的存储和传递需要开发者维护。

1.2 Cookie机制
Cookie是由客户端保存的小型文本文件,其内容为一系列的键值对。 
Cookie是由HTTP服务器设置的,保存在浏览器中, 在用户访问其他页面时,会在HTTP请求中附上该服务器之前设置的Cookie。 
Cookie的实现标准定义在RFC2109: HTTP State Management Mechanism中。 那么Cookie是怎样工作的呢?下面给出整个Cookie的传递流程:

1、浏览器向某个URL发起HTTP请求(可以是任何请求,比如GET一个页面、POST一个登录表单等)
2、对应的服务器收到该HTTP请求,并计算应当返回给浏览器的HTTP响应。
    HTTP响应包括请求头和请求体两部分,可以参见:读 HTTP 协议。
3、在响应头加入Set-Cookie字段,它的值是要设置的Cookie。
    在RFC2109 6.3 Implementation Limits中提到: UserAgent(浏览器就是一种用户代理)至少应支持300项Cookie, 
    每项至少应支持到4096字节,每个域名至少支持20项Cookie。
4、浏览器收到来自服务器的HTTP响应。
5、浏览器在响应头中发现Set-Cookie字段,就会将该字段的值保存在内存或者硬盘中。
    Set-Cookie字段的值可以是很多项Cookie,每一项都可以指定过期时间Expires。 默认的过期时间是用户关闭浏览器时。
6、浏览器下次给该服务器发送HTTP请求时, 会将服务器设置的Cookie附加在HTTP请求的头字段Cookie中。
    浏览器可以存储多个域名下的Cookie,但只发送当前请求的域名曾经指定的Cookie, 这个域名也可以在Set-Cookie字段中指定)。
7、服务器收到这个HTTP请求,发现请求头中有Cookie字段, 便知道之前就和这个用户打过交道了。
8、过期的Cookie会被浏览器删除。

总之,服务器通过Set-Cookie响应头字段来指示浏览器保存Cookie, 浏览器通过Cookie请求头字段来告诉服务器之前的状态。 
Cookie中包含若干个键值对,每个键值对可以设置过期时间。


二、项目中服务器支持cookie,拿点时间做了小测试。
使用okhttp做网络请求,配置PersitentCookieStore,使用wireshark抓取项目中某接口的http层对话过程。

/*登录,服务器返回cookie*/

/*请求header*/
POST /chainsell/index.php?act=login&op=dologin 
HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 41
Host: ceshi.abcd.cn
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.3.1

/*请求body,post请求的参数*/
user=ergouzi&pwd=123456&client=android

/*响应header,返回了cookie*/
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 26 Nov 2016 13:51:03 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.45
Set-Cookie: PHPSESSID=q38q5o78qv01f6j5vudevumec4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: 4E19_auto_login=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=abcd.cn
Content-Encoding: gzip
Vary: Accept-Encoding

/*响应body*/
{"code":200,"datas":{"is_login":"1","member_id":"288","chain_member_name":"ergouzi","appkey":"b5a97ce8d7c2feb8e31ad9a56e53549d","is_buy":"1","chain_id":"233","store_id":null,"account_key":"YXWLm","seller_is_admin":1,"seller_limits":[""],"seller_group_id":"0","seller_gc_limits":null,"seller_group_name":"\u7ba1\u7406\u5458","seller_smt_limits":false}}

/*使用返回的token(appkey),请求用户订单操作*/
GET /chainsell/index.php?act=chain_purchase&op=daifu&order_id=8507&daifu_amount=1356&appkey=b5a97ce8d7c2feb8e31ad9a56e53549d 
HTTP/1.1
Host: ceshi.abcd.cn
Connection: Keep-Alive
Accept-Encoding: gzip
Cookie: PHPSESSID=q38q5o78qv01f6j5vudevumec4//携带了cookie
User-Agent: okhttp/3.3.1

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 26 Nov 2016 13:51:06 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.45
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding

//200OK,操作成功!
{"code":200,"datas":{"message":"\u7533\u8bf7\u4ee3\u4ed8\u6210\u529f"}}

/*使用伪token请求订单操作,仍然响应成功,可以看出服务器根据cookie来判断客户端的用户*/

GET /chainsell/index.php?act=chain_purchase&op=daifu&order_id=8507&daifu_amount=1356&appkey=*THIS_IS_NO_SENSE_FAKE_TOKEN* 
HTTP/1.1
Host: ceshi.abcd.cn
Connection: Keep-Alive
Accept-Encoding: gzip
Cookie: PHPSESSID=q38q5o78qv01f6j5vudevumec4//携带了cookie
User-Agent: okhttp/3.3.1

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 26 Nov 2016 14:13:05 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.45
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding

{"code":200,"datas":{"message":"\u7533\u8bf7\u4ee3\u4ed8\u6210\u529f"}}


/*清除cookie之后,再次请求用户订单操作,请求头中没有了cookie*/
GET /chainsell/index.php?act=chain_purchase&op=daifu&order_id=8507&daifu_amount=1356&appkey=b5a97ce8d7c2feb8e31ad9a56e53549d 
HTTP/1.1
Host: ceshi.abcd.cn
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.3.1

//响应头中重新返回了新的cookie
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 26 Nov 2016 13:51:12 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.45
Set-Cookie: PHPSESSID=36dqabcbh6bpljrs7nc2rq88q1; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding

//400,提示请重新登录。
{"code":400,"message":"\u8bf7\u91cd\u65b0\u767b\u5f55"}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值