1. 使用 GET 请求访问一个登陆界面,html 代码如下
点击查看代码
<h2>登录</h2>{% for message in messages %}<p style="color: green;">{{ message }}</p>
{% endfor %}<form method="POST">{% csrf_token %}{{ form.as_p }}<button type="submit">登录</button>
</form>
2. Django 的机制
由于模板代码中有 {% csrf_token %} 标签,Django 会使用 django.middleware.csrf.get_token函数随机生成一个长度为32的字符串,比如 Vx3DYn07KN4a6XfjpD1LBEUsQKoAupk5。
然后 Django 会将 Vx3DYn07KN4a6XfjpD1LBEUsQKoAupk5当成cookie放入响应报文中的Set-Cookie字段返回给客户端,cookie的名字叫做 csrktoken, cookie的值即为 Vx3DYn07KN4a6XfjpD1LBEUsQKoAupk5。
Django 会随机生成一个掩码mask,表单中填充的 csrfmiddlewaretoken的值 = mask + mask XOR csrftoken, 长度为64,比如 csrfmiddlewaretoken = oOXDh89xN0MB61HLNuwFOBZMzMgxb1E69bQ65lZunDGB2OMU2Xngf5J4fmuXvgO1
Django 会将这个html放入报文中的响应体返回给客户端
3. 客户端会保存 csrftoken 这个 cookie,也会收到登陆界面,如下图


