HTTP(HyperText Transfer Protocol)协议是基于应用层的协议,完成客户端发送请求到服务端等一系列的运作流程,中文简称超文本传输协议。HTTP诞生于1989年3月,最初由蒂姆·伯纳斯-李博士提出,目的是实现让远隔重洋的研究者们共享知识的设想。1997年1月发布了HTTP/1.1的版本,也就是目前,比较主流的HTTP协议版本。由于HTTP是基于应用层的协议,因此客户端不需要关注底层的网络细节,连接请求由可靠的传输协议TCP/IP负责。当客户端发送请求给服务端的时候,客户端与服务器之间建立了通信,请求完成后客户端与服务端之间的通信完成,请求流程如下图所示。
具体步骤为:
(1) 在发送请求前,客户端与服务端之间请求建立通信,打开TCP的连接;
(2) 建立TCP连接后,客户端发送请求到服务端;
(3) 服务端收到响应后回复给客户端;
(4) 客户端收到服务端的回应后关闭TCP的连接。
例如,访问百度首页,打开浏览器,输https://www.baidu.com/域名后,按下回车键就可以跳转到百度的首页。在一个完整的HTTP请求流程中,客户端发送HTTP的请求给服务端,这中间需要明确地告诉服务端请求的地址,也就是统一资源定位符URL,URL主要由三部分组成,分别是HTTP协议,服务器地址和资源,例如,地址http://www.cnblogs.com/weke/category/831885.html中,http://是协议,www.cnblogs.com是被请求的服务器,/weke/category/831885.html是请求资源。
在HTTP的协议中,客户端发送请求到服务端的过程中,客户端需要告诉服务端是以什么样的请求方式去请求。在HTTP的协议中,HTTP的请求方法主要为GET,POST,HEAD,PUT,DELETE,CONNECT,OPTIONS和TRACE,最常用的请求方法是GTE和POST,GET指的是从服务端获取资源,POST是向指定资源提交数据进行请求处理。
在HTTP的协议中,客户端发送请求给服务端,服务端响应回复给客户端的同时,还会带上HTTP协议的状态码,关于状态码这部分改天单独的介绍。
由于HTTP是一个无状态的协议,所以也就导致了Cookie技术的发展,Cookie存储在客户端,而对于一些敏感的信息来说,存储在本地显然是不安全的,例如,登录系统的账号和密码,被别人获取后会对个人的隐私造成影响。Session则将信息存储在服务端。使用Session来保持会话,也就是说客户端发送请求后,服务端在接收到客户端的信息后,把Session的信息存储在服务端的数据库中并且记录下来。还是以以上代码为例,把实现的方式修改为Session,修改后的代码如下:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render,redirect,render_to_response
from django.http import HttpResponse,Http404,HttpResponseRedirect
# Create your views here.
def index(request):
username = request.session.get('user', None)
return render(request,'blog/index.html',locals())
def article(request,year,month):
return HttpResponse('2004')
def login(request):
if request.method=='GET':
return render(request,'blog/login.html',locals())
if request.method=='POST':
username=request.POST.get('username',None)
password=request.POST.get('password',None)
if username=='wuya' and password=='admin':
r=redirect('blog:index')
request.session['user'] = username
return r
return render(request,'blog/login.html',locals())
在浏览器中访问http://localhost:8000/blog/login,打开浏览器的调试模式到Network,输入用户名和密码,点击“登录”按钮登录到系统。http://localhost: 8000/blog/login的Response Headers信息如下:
在以上的Set-Cookie服务端会记录客户端登录成功后的SessionID并且存储在服务端的数据库中,数据库存储的SessionID如下图所示。
登录系统成功后,客户端请求头的信息如下:
客户端请求头的Cookie中的SessionID与存储在服务端的SessionID信息一致,因此Session的请求流程为:
(1) 客户端中输入用户名和密码,点击“登录”按钮发送请求到服务端;
(2) 登录成功后,服务端把SessionID存储在数据库中并且在响应头Set-Cookie中记录下SessionID反馈给客户端;
(3) 客户端再次发送请求的时候,在请求头Cookie带上SessionID信息;
(4) 服务端接收到客户端发送的SessionID,会与存储在服务端数据库中的SessionID做校验检查是否存在,如果存在则显示用户的信息;如果不存在就跳转到登录的页面。