参考:https://my.oschina.net/xianggao/blog/395675?fromerr=GC9KVenEhtml
【前言】登陆时须要post的表单信息。java
先跳过具体案例,讲解基础知识:python
会话(Session)跟踪是Web程序中经常使用的技术,用来跟踪用户的整个会话。经常使用的会话跟踪技术是Cookie与Session。Cookie经过在客户端记录信息肯定用户身份,Session经过在服务器端记录信息肯定用户身份。apache
本章将系统地讲述Cookie与Session机制,并比较说明何时不能用Cookie,何时不能用Session。还有token的应用。浏览器
Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,而后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。让咱们说得更具体一些:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的我的信息而且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些我的信息,固然这些信息并非存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应以后,浏览器会将这些信息存放在一个统一的位置,对于Windows操做系统而言,咱们能够从: [系统盘]:\Documents and Settings[用户名]\Cookies目录中找到存储的Cookie;自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而此次,Cookie信息则存放在HTTP请求头(Request Header)了。tomcat
有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求以后,就可以经过分析存放于请求头的Cookie获得客户端特有的信息,从而动态生成与该客户端相对应的内容。一般,咱们能够从不少网站的登陆界面中看到“请记住我”这样的选项,若是你勾选了它以后再登陆,那么在下一次访问该网站的时候就不须要进行重复而繁琐的登陆动做了,而这个功能就是经过Cookie实现的。安全
在程序中,会话跟踪是很重要的事情。理论上,一个用户的全部请求操做都应该属于同一个会话,而另外一个用户的全部请求操做则应该属于另外一个会话,两者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不管是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的链接就会关闭,再次交换数据须要创建新的链接。这就意味着服务器没法从链接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经没法判断该购买行为是属于用户A的会话仍是用户B的会话了。要跟踪该会话,必须引入一种机制。服务器
Cookie就是这样的一种机制。它能够弥补HTTP协议无状态的不足。在Session出现以前,基本上全部的网站都采用Cookie来跟踪会话。cookie
若是你把Cookies当作为http协议的一个扩展的话,理解起来就容易的多了,其实本质上cookies就是http的一个扩展。有两个http头部是专门负责设置以及发送cookie的,它们分别是Set-Cookie以及Cookie。当服务器返回给客户端一个http响应信息时,其中若是包含Set-Cookie这个头部时,意思就是指示客户端创建一个cookie,而且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过时。若是cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookie。另一种状况就是保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。一个cookie的设置以及发送过程分为如下四步:session
客户端发送一个http请求到服务器端 服务器端发送一个http响应到客户端,其中包含Set-Cookie头部 客户端发送一个http请求到服务器端,其中包含Cookie头部 服务器端发送一个http响应到客户端
这个通信过程也能够用如下下示意图来描述:
Session是另外一种记录客户状态的机制,不一样的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只须要从该Session中查找该客户的状态就能够了。
若是说Cookie机制是经过检查客户身上的“通行证”来肯定客户身份的话,那么Session机制就是经过检查服务器上的“客户明细表”来确认客户身份。Session至关于程序在服务器上创建的一份客户档案,客户来访的时候只须要查询客户档案表就能够了。
服务器管理session通讯的方式有不少。在客户端保持jsessionid只是其中一个,我遇到的是jsessionid放在cookie里面作一个字段,发送到服务器分配的内存,如此来标识访问。有的是放在url中,我没遇到过。requests库,能够保持session,简单方便。jsession只是tomcat—java服务器对session的id的叫法。
经过sessionid的方式来实现session只是分布式服务器下的一种方法,更多可参考这里。
Cookie和Session的方案虽然分别属于客户端和服务端,可是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,所以当咱们彻底禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。
做用:
一、保持登陆;二、服务器端可能会作一些信息保存,针对性识别,个性化推荐
http://www.javashuo.com/article/p-udtpjiug-ch.html
token的提出,主要是应对CSRF攻击(跨站请求伪造)的。简而言之就是用户在信任网站A,并保存cookie的状况下,没有关闭A(即便关闭了页面cookie也不必定立刻过时)就去访问危险网站B了。B就会利用A的cookie去访问服务器。用户在保持session()时,post()还要提交token.
下面是在未登录前,经过get(),解析html获得的token,其值是一个散列值。post()时要带上此token.
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="7f3339af30244a99d366b9dd047080b3"></div>
Django中有一个应对CSRF的中间件:CsrfMiddleware。经过在setting中的中间件配置中加上,而后在html表单里面加上token的位置,就能够了。具体可参考:我。
http://www.cnblogs.com/freely/p/6926253.html