Cookie配置,及Http过程对话

来源:互联网 发布:淘宝仓库发货总结 编辑:程序博客网 时间:2024/06/05 16:03
一、Cookie1.1 Cookie与tokencookie最初是解决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.1Content-Type: application/x-www-form-urlencodedContent-Length: 41Host: ceshi.abcd.cnConnection: Keep-AliveAccept-Encoding: gzipUser-Agent: okhttp/3.3.1/*请求body,post请求的参数*/user=ergouzi&pwd=123456&client=android/*响应header,返回了cookie*/HTTP/1.1 200 OKServer: nginxDate: Sat, 26 Nov 2016 13:51:03 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveX-Powered-By: PHP/5.4.45Set-Cookie: PHPSESSID=q38q5o78qv01f6j5vudevumec4; path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheSet-Cookie: 4E19_auto_login=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=abcd.cnContent-Encoding: gzipVary: 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.1Host: ceshi.abcd.cnConnection: Keep-AliveAccept-Encoding: gzipCookie: PHPSESSID=q38q5o78qv01f6j5vudevumec4//携带了cookieUser-Agent: okhttp/3.3.1HTTP/1.1 200 OKServer: nginxDate: Sat, 26 Nov 2016 13:51:06 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveX-Powered-By: PHP/5.4.45Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Encoding: gzipVary: 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.1Host: ceshi.abcd.cnConnection: Keep-AliveAccept-Encoding: gzipCookie: PHPSESSID=q38q5o78qv01f6j5vudevumec4//携带了cookieUser-Agent: okhttp/3.3.1HTTP/1.1 200 OKServer: nginxDate: Sat, 26 Nov 2016 14:13:05 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveX-Powered-By: PHP/5.4.45Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Encoding: gzipVary: 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.1Host: ceshi.abcd.cnConnection: Keep-AliveAccept-Encoding: gzipUser-Agent: okhttp/3.3.1//响应头中重新返回了新的cookieHTTP/1.1 200 OKServer: nginxDate: Sat, 26 Nov 2016 13:51:12 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveX-Powered-By: PHP/5.4.45Set-Cookie: PHPSESSID=36dqabcbh6bpljrs7nc2rq88q1; path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Encoding: gzipVary: Accept-Encoding//400,提示请重新登录。{"code":400,"message":"\u8bf7\u91cd\u65b0\u767b\u5f55"}
0 0
原创粉丝点击