cookie和session

cookie和session的简单介绍

cookie和session的背景

cookie:
    1. 网站它是不用保存用户的信息,最早期的时候,网站都是一些静态网站
        eg:新闻网站  博客
    2. 随着技术发展,诞生了很多需要登录的网站
        eg: 淘宝  京东  支付宝...

登录:解决了在网站中,网站可以识别出你是谁

        以登录为例,当用户第一次登录网站的时候,用户输入用户名和密码,如果不保存下来,拿用户就每次都需要登录,很麻烦所以我们使用了cookie


      当用户第一次登录成功网站的时候,服务端告诉浏览器把用户名和密码都给用户的浏览器,然后,用户浏览器把用户名和密码保存在本地,之后,用户在每次访问网站的时候,会自动把之前保存的用户名和密码都传给服务端,服务端接收浏览器传过来的用户名和密码在进行验证.

缺点就是数据在浏览器上不安全

cookie的存储方式:使用K:V键值对的方式存储

session

session的诞生:session是把数据保存在服务端的,但是session会随机生成一个字符串 ,然后在服务端做随机字符串和用户信息的对应关系,简单来说就是把用户信息保存在数据表中。

session的保存方式:首先生成一个随机字符串对应一个用户信息

随机字符串:用户信息

随机字符串1:用户信息1

随机字符串2:用户信息2

session所做的流程

  1. 首先生成一个字符串
  2. 把随机生成的字符串和用户信息的对应关系保存在数据表中
  3. 把随机字符串返回给浏览器,让浏览器随机的字符串保存下来
  4. 当用户访问网站时,会把随机字符串一并提交过来,服务端在拿着随机的字符串去数据库中去查询,如果查询到了,说明登录成功了,如果查不到就说明没有登录,或者失效了

cookie的操作

cookie的执行流程图

cookie和session_第1张图片

        当我们在浏览需要登录的网页时,再浏览器中设置禁言cookie,那么以后再这个浏览器中都将无法登陆需要登录的页面

例如:

登录淘宝

cookie和session_第2张图片

登录之后,我们关闭cookie

cookie和session_第3张图片

cookie和session_第4张图片

使用Django操作cookie

使用obj = 三板斧来进行cookie的操作

obj = HttpRedponse
obj = redirect
obj = render


设置cookie
obj.set_cookie(‘key’,‘value’)
获取cookie
print(request.COOKIES.get('key))

cookie和session_第5张图片

def login(request, *args, **kwargs):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = models.Userinfo.objects.filter(pk=1).first()
        # 判断用户名与密码是否正确
        if username == user_obj.username and password == user_obj.password:
            print('登录成功')
            # 登录成功后应该保存用户信息,使用cookie保存用户信息
            obj = redirect('/home/')
            obj.set_cookie('username', 'kk')
            return obj

    return render(request, 'login.html')


def home(request):
    if request.COOKIES.get('username'):
        return HttpResponse('这是登录页面')
    return redirect('/login/')


def login_auth(func):
    def inner(request, *args, **kwargs):
        # 判断:如果登录成功了就正常执行,登录失败则跳转到登录页面
        if request.COOKIES.get('username'):
            res = func(request, *args, **kwargs)
            return res
        else:
            return redirect('/login/')

    return inner


@login_auth
def index(request):
    return HttpResponse('这是登录的页面')

cookie设置过期时间

如果不加过期时间则永久生效

设置过期时间的两个方法:

  1. max_age:其他浏览器
  2. expires:IE浏览器
  3. max_age=3 三秒后过期消失,以秒为单位
  4. path=‘路径’,不写或者path=‘/’都是全局生效的意思
  5. domain(不常用):域名,例如www.baidu,com,那么所在的cookie就会在这个域名以下的都会生效,不写就是当前
  6. 前端也可以获取cookie和session,通过js来操作,使用的是localstorage和sessionstorage
  7. httpolny=False 只能使用http来传输,不能使用js来操作

完整的语法为:

obj.set_cookie('key值','value值',max_age=‘过期时间,秒数’,path=‘路径’)
删除cookie
def logout(request):# 用在退出功能或者注销功能时,使用
res=redirect('/login/')
res.delete_cookie('user) # 删除用户浏览器上之前设置的cookie值

session的操作

session保存步骤(原理)
  1. 先做用户信息的认证
  2. 生成一个随机字符串
  3. 用这个随机字符串和用户信息做映射,之后进行保存,Django默认保存在MySql中

key

data

随机字符串

用户信息

  1. 服务端会把随机生成的字符串返回给浏览器,浏览器把随机字符串保存起来,下次访问网页时,会将保存的随机字符串一并传给服务端,服务端用传过来的随机字符串去数据表中查询,如果查询数据表中有,说明已经登录过了。

session的操作

设置session

def set_session(request):
    request.session['username']='kk'
    
    return HttpResponse('set_session')

设置session所发生的事情:

  1. 生成一个随机的字符串
  2. 把数据保存到Django_session表中,这个操作是使用中间件保存的,当请求来的时候,把数据准备好,保存在缓存中,当响应离开时,才真正执行了creat或insert方法

cookie和session_第6张图片

  1. 把随机字符串返回给浏览器

cookie和session_第7张图片

获取session

def get_session(request):
print(request.session['usernmae'])
print(request.session.get('username'))
return HttpResponse

获取session发生的事情:

  1. 获取cookie值,名为sessionid值
  2. 使用这个cookie值拿到数据库中查询
  3. 如果查询到,把查询到的数据封装到request.session中

CBV添加装饰器

from django.views import View
from django.utils.decorators import method_decorator


@method_decorator(login_auth, name='post')  # 方式1
@method_decorator(login_auth)  # 方式2 使所class对象下的所有属性都添加装饰器
class loh(View):
    def dispatch(self, request, *args, **kwargs):
        return super(loh, self).dispatch(request, *args, **kwargs)

    @method_decorator(login_auth)  # 方式3
    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return HttpResponse('post')

中间件的操作与使用

自定义中间件
  1. 在主目录下创建了一个mymiddleware.py的文件;
  2. 在mymiddleware.py的文件中创建一个MyException的类;
  3. 自定义时你想要在哪一块加功能就定义相对应的方法,不用全部都定义。
  4. 一定不能忘记注册!!!

在项目的根目录下新建一个包(文件),在包中自定义一个py文件,在里面自定义一个中间件

class mymd(object):

    def __init__(self,get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 数据进入
        response = self.get_response(request)
        # 数据离开
        return response
    

使用函数自定义中间件

from django.shortcuts import HttpResponse
from django.utils.deprecation import MiddlewareMixin


class Myexception(MiddlewareMixin):

    def process_request(self, request):  # 执行视图函数之前被调用
        print('自定义的process_request')
        return request

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('自定义的process_view')  # 执行视图函数之后被调用
        return None

    def process_template_response(self, request, response):
        print('自定义的process_template')  # 执行视图函数完毕之后被调用
        return response

    def process_response(self, request, response):  # 响应返回浏览器之前被调用
        print('自定义的process_response')
        return response

    def process_exception(self, request, exception):  # 视图函数抛出异常时调用
        print('自定义的process_exception')
        return HttpResponse(exception)

cookie和session_第8张图片

你可能感兴趣的:(java,前端,服务器)