HTTP 协议

Posted Cloud-Tony

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 协议相关的知识,希望对你有一定的参考价值。

socket 与TCP 协议的关系---socket是对TCP UDP 封装,

WEB服务是标准的CS模式---BS模式

import socket
sock=socket.socket()
sock.bind((\'127.0.0.1\',8080))
sock.listen(5)
while True:
    conn,addr=sock.accept()
    data=conn.recv(1024)
    print(data.decode(\'utf-8\'))
    
    conn.send(b\'Hello yuan\')

 

cookie:

因为HTTP协议是无状态的,不保留用户的信息。

1、一定是因为HTTP是无状态的,所以才有COOKIE

2、就是一个容器(或字典)可以存放多组键值对,辨别用户身份、进行session跟踪而存储在用户本地端的数据。

3、当用户浏览带着cookie来访问服务器时,这个时候称为 . cookies

wps1C7B.tmp

 

二、响应协议(server 给浏览器的)

wps8B36.tmp

wpsC26D.tmp

上面图片格式:

Response Header

响应首行: 

响应头信息:

空行:

响应体:

wps5C0D.tmp

 

wps8B77.tmp

 

http  之referer:

referer是http请求头中的一个请求报头,用于告知服务器用户的来源页面,主要被用于SEO 统计,例如:在打一个搜索引擎输入关键字,查找的内容并点击进去,这时候就有一个referer是从这个搜索引擎这点击得来,这个连接就可用于SEO的访问量数据, 如图:例如这个就是从baidu 跳转过去,就会有referer,如果是直接从浏览地址输入网址便不会有referer

三、session cookie 

cookie :  是保存在客户端浏览器的键值对。 

由于http 的协议是无状态的,服务器无法从网络连接知道客户的身份,最早由netscape发展的机制就是:  给客户端 发一个通行证,每人一个,这样一来无论谁访问都必须携带自己通行证,服务器就能从通行证确认客户的身份的,这就是cookie的工作原理。

cookie 实际上是段字符信息, 当客户端一访问服务器,如果服务器要记录用户的状态就会响应客户端浏览器并颁发一个cookie,客户端浏览器将cookie 保存起来,当浏览器再次访问服务器时,客户端浏览器将把该请求的网址连同cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户状态。服务器可以根据需要修改cookie的内容。

 

session: 是保存在服务器端的数据(以某种格式存储在服务器)

Session 是以某种格式存储在服务器的数据,客户端浏览器访问服务器端的时候,服务器把客户信息以某种格式记录在服务器上,当客户端再次访问时只需从该session中查找该用户信息就可以了。

除了使用cookie,web 应用程序 中还经常使用session来保存客户端的状态,Session是一种记录客户端状态的机制,

django 中使用session:

每创建一个django 项目中,在app中的models.py 中创建好表,应用 python manage.py makemigrations    python manage.py migrate.  ,应用后就可以看到有个db.sqlite3 的数据库,或者使用mysql数据库。 数据库中有一个叫django_session 的表,里面存储的就是session 字符 串

 

测试:

1、建表  

app下的models.py下创建表:

 

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    username=models.CharField(max_length=32)
    mail=models.EmailField(max_length=32,verbose_name=\'邮箱\',help_text=\'33333@qq.com\') 

 2、创建URL

项目下的urls.py 

from django.conf.urls import url
from django.contrib import admin
from practice1 import views
urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^test/\',views.test),
    url(r\'^login\',views.login),
    url(r\'^index\',views.index),
]

3、app 下的views.py 函数:

url 对应的处理的view函数 :

from django.shortcuts import render,HttpResponse,redirect
from practice1 import models

# Create your views here.
def test(request):
    v=models.UserInfo.objects.create(username=\'root\',mail=\'423142@qq.com\')
    # return render(request,\'test.html\',{
    #               \'userinfo\':{\'k1\':\'v1\',\'k2\':\'v2\',\'name\':\'tony\'}})
    response=HttpResponse(\'comntent\')
    response.set_cookie(\'k1\',\'v2\')
    response.set_cookie(\'k2\',\'v3\')
    response.set_cookie(\'k3\',\'v4\')
    return response




def login(request):
    if request.method==\'GET\':
        return render(request,\'login.html\')
    else:
        #1、生成随机字符串
        #2、通过cookie 发送给客户端
        #3、服务端 保存{随机字符 串1:{‘XXXXX’:df}}
        request.session[\'username\']=\'tony\'
        # 对于随机字符串现在变成{\'username\':tony,\'email\':\'xxxx\'....}
        request.session[\'email\']=\'tony@qq.com\'

        u=request.POST.get(\'user\')
        p=request.POST.get(\'pwd\')
        if u==\'tony\' and p==\'123\':
            return redirect(\'/index/\')
        else:
            return render(request,\'login.html\',{\'msg\':\'hel\'})


def index(request):
    # 1、获取客户端 COOKIE中的随机字符串
    # 2、去SEESION 中查找有没有随机字符串
    # 3、去SESSION中查看对应的KEY 中查看是否有 username
    v=request.session.get(\'username\')
    request.session[\'k1\']=123
    if v:
        print(v)
        return  HttpResponse(\'login success:%s\'%v)
    else:
        return  redirect(\'/login/\')

4、函数对应的页面:

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login/" method="POST">
    user:<input type="text" name="user">
    pwd: <input type="text" name="pwd">


    <input type="submit" value="提交">


</form>
</body>
</html>

django中设置session:  settings.py文件中

SESSION_ENGINE=\'django.contrib.sessions.backends.db\' # 默认将session 存放数据 库 ,可以存放 数据库,文件,内存,cookie, 加密的一个cookie的里面

#推荐使用数据库,,,, 缓存、
SESSION_COOKIE_SECURE=False #是否https传输cookid (默认)
SESSION_COOKIE_NAME="gpsd" #设置session 名字
SESSION_COOKIE_PATH="/" #session 的保存路径
SESSION_COOKIE_AGE=1209600  #session 的存活时间 1209600为两周
# SESSION_EXPIRE_AT_BROWSER_CLOSE=False #是否关闭浏览器session 就过期
# SESSION_SAVE_EVERY_REQUEST=False #是否每次请求都保存session ,默认修改之后才保存
# # 改成True 每十分钟都操作,session 在30分钟(如果期限为30分钟)的期限内一直都不会过期
#
# # 1、
# #django session还可以存在缓存里
# SESSION_ENGINE=\'django.contrib.sessions.backends.cache\'
# SESSION_CACHE_ALIAS=\'defaults\'#使用缓存别名(默认内存缓存,)此处别名依赖缓存的设置
# #还需要配合django缓存配置
#
#
# # 2、缓存加数据库 ------鸡肋---不用
#
# SESSION_ENGINE=\'django.contrib.sessions.backends.cached_db\'

使用:

views.py 
设置cookie
def test(request):
    # v=models.UserInfo.objects.create(username=\'root\',mail=\'423142@qq.com\')
    # return render(request,\'test.html\',{
                  # \'userinfo\':{\'k1\':\'v1\',\'k2\':\'v2\',\'name\':\'tony\'}})
    response=HttpResponse(\'comntent\')
    response.set_cookie(\'k1\',\'v2\')
    response.set_cookie(\'k2\',\'v3\')
    response.set_cookie(\'k3\',\'v4\')
    return HttpResponse(\'abc\')

获取客户端的session id

 

def index(request):
    # 1、获取客户端 COOKIE中的随机字符串
    # 2、去SEESION 中查找有没有随机字符串
    # 3、去SESSION中查看对应的KEY 中查看是否有 username
    v=request.session.get(\'username\')
    v1=request.session[\'username\'] #与get 一样,是取值的功能,如果没有 username 就会报错
    request.session.get[\'k1\',None] #如果没有k1 就会只取到None
    request.session.get[\'k1\']=123 # 不管存在不都设置 k1 成123
    request.session.get.setdefault(\'k1\',12)#不存在的时候才设置,存在就不设置了
    del request.session[\'k1\'] #只删除这个session 中的k1 的值,session 中还有其它 k2,k3,k4

    #所有的键、值
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()

    #获取用户session的随机字符串
    request.session.session_key

    #删除当前用户的所有session数据 :
    request.session.delete(\'session_key\')#放的是request.session.session_key ,这个随机字符 串
    #被删除掉,这个人的随机字符 串没了,下次就要重要登录了

    #检查用户session随机字符串(是否存在数据库中)
    request.session.exist(\'session_key\')#存放的是request.session.session_key . 还是这个随机字符 串

    #将失效的session ,也就是小于当前日期的数据删除,因为 数据 库不知道哪些数据该删除 ,而django则会的这个方法会执行这个操作
    request.session.clear_expired()

    #这个方法会设置两个地方的值,一个是数据 库,一个是浏览器的 session 的值。比如:在浏览器上有个默认超时时间是两周,这可以设置这个cookiesession的超时时间,值是秒
    request.session.set_expiry(200000)

    print(v1,\'-----------\')
    if v:
        print(v)
        return  HttpResponse(\'login success:%s\'%v)
    else:
        return  redirect(\'/login/\')

 

以上是关于HTTP 协议的主要内容,如果未能解决你的问题,请参考以下文章

怎么用http协议实现安卓数据

CPNtools协议建模安全分析---实例变迁标记

HTTP客户端代码片段

高效Web开发的10个jQuery代码片段

如何从一个片段导航到另一个片段?

这两个代码片段有啥区别?