首页 > 其他分享 >Cookie和Session

Cookie和Session

时间:2024-03-28 20:02:07浏览次数:16  
标签:return get request sign Session Cookie cookie login

Cookie和Session

1.Cookie和Session介绍

  • 服务器保存在客户端浏览器上的信息都可以称之为cookie
  • 指代服务端让客户端保存的数据(存储在客户端上与用户信息相关的数据)
  • 它的表现形式一般都是k:v键值对(可以有多个)

1.2 Session

  • 保存在服务器上的信息都可以称之为session
  • 指代服务端保存的跟用户信息相关的数据
  • 它的表现形式一般都是 session_id :随机的字符串

2. Django操作Cookie

2.1 视图函数的返回值(三板斧)

  • 正常返回三板斧对象
return HttpResponse()
return render()
return redirect()
  • 变形
obj = HttpResponse()
return obj

obj1 = render()
return obj1

obj2 = redirect()
return obj2

如果想要操作cookie,必须进行以上变形才可以

2.2 设置cookie

# 1.获取响应对象
obj = HttpResponse("注册成功")
# 2.设置cookie
# max_age=5,设置超时时间 5s 到期
obj.set_cookie(key,value,max_age=5)
# 3.获取cookie
cookie = request.COOKIES.get('key')
# 4.删除注销cookie
obj.delete_cookie("key")
return obj

3.登陆功能实现

(1)简单实现

  • 路由
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('home/', views.home),
]
  • 视图
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == "dream" and password == "521":
            # 登陆成功之后,跳转到登陆成功之后才能看到的页面
            return redirect('/home/')
    return render(request, 'login.html')


def home(request):
    return HttpResponse("登陆成功!")
  • 前端
<form action="" method="post">
    <p>username:<input type="text" name="username" class="form-control"></p>
    <p>password:<input type="password" name="password" class="form-control"></p>
    <input type="submit" class="btn btn-success">
</form>
  • 问题
    • 登陆成功之后的跳转页面,不需要登陆也可以直接访问到,只需要给对应的地址即可

(2)解决登陆问题

from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == "dream" and password == "521":
            # 登陆成功之后,保存用户登陆状态
            obj = redirect('/home/')
            # 让浏览器记录cookie
            obj.set_cookie("sign", "1314521")
            '''
            浏览器不单单只是帮我们保存cookie
            而且在后面每次访问的时候都会带着cookie
            '''
            # 登陆成功之后,跳转到登陆成功之后才能看到的页面
            return obj
    return render(request, 'login.html')


def home(request):
    # 读取携带的cookie,cookie正确登陆成功
    if request.COOKIES.get("sign") == "1314521":
        return HttpResponse("登陆成功!")
    # 读取携带的cookie,cookie不正确跳转到登陆页面
    return redirect('/login/')

(3)迭代-登陆认证装饰器

  • 用户如果没有登陆的情况下想访问一个需要登录的页面
  • 那么先跳转到登录页面,当用户输入正确的用户名和密码之后
  • 再跳转到用户之前想访问的页面去,而不是直接写死
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == "dream" and password == "521":
            # 获取用户上一次想要访问的url
            # 结果可能为空 -- 直接访问login
            tag_url = request.GET.get('tag_url')
            if tag_url:
                obj = redirect(tag_url)
            else:
                # 登陆成功之后,保存用户登陆状态
                obj = redirect('/home/')
            # 让浏览器记录cookie
            obj.set_cookie("sign", "1314521")
            '''
            浏览器不单单只是帮我们保存cookie
            而且在后面每次访问的时候都会带着cookie
            '''
            # 登陆成功之后,跳转到登陆成功之后才能看到的页面
            return obj
    return render(request, 'login.html')


# 校验用户登录状态的装饰器
def auth_check(func):
    def inner(request, *args, **kwargs):
        # 获取到用户上一次想要访问的url
        tag_url = request.get_full_path()
        # 读取携带的cookie,cookie正确登陆成功
        if request.COOKIES.get("sign") == "1314521":
            res = func(request, *args, **kwargs)
            return res
        else:
            # 读取携带的cookie,cookie不正确跳转到登陆页面
            return redirect(f'/login/?next={tag_url}')

    return inner


@auth_check
def home(request):
    return HttpResponse("home登陆成功!")


@auth_check
def index(request):
    return HttpResponse("index登陆成功!")


@auth_check
def func(request):
    return HttpResponse("func登陆成功!")

4.Django操作session

  • Django使用session的前提是已经迁移过数据库并且数据库中有 django_session 这张表
  • Django的session默认过期时间是 14 天
def login(request):
    if request.method == "POST":
        data = request.POST
        username = data.get("username")
        password = data.get("password")
        if username == "dream" and password == "521":
            # request.session["sign"] = "6666"
            # request.session["sign"] = "777"
            request.session["sign"] = "888"
            # 产生了一个随机的字符串
            # 把这个随机字符串跟加密的数据绑定在一起
            # 将这个随机字符串发送给客户端

            # 如果session中放入多个值的情况下
            # 默认采用最后一个session值而不是第一个

            # 设置过期时间
            # request.session.set_expiry(3)
            # 如果是数字的话,过期时间就是在指定 秒数后过期
            # request.session.set_expiry(0)
            # 如果参数是数字 0 ,过期时间是随着浏览器的关闭后,session 会直接过期
            #
            obj = HttpResponse("登陆成功")
            return obj
        return HttpResponse("登录失败")
    return render(request, "login.html", locals())


def index(request):
    sign = request.session.get("sign")
    if sign and sign == "888":
        return HttpResponse("index")
    return redirect("login")


def logout(request):
    print(request.session.get("sign"))
    # request.session.delete()
    # 该方法用于删除当前用户的Session数据,但会保留Session的Key。
    # 这意味着Session对象本身仍然存在,但其中的数据将被清空。
    # 下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象。

    request.session.flush()
    # 该方法用于完全删除当前用户的Session,包括Session对象和所有相关数据。
    # 下次访问时,将创建一个新的空Session对象。
    print(request.session.get("sign"))
    return redirect("login")

5. 给CBV添加装饰器的三种方式

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


def login(request):
    if request.method == "POST":
        data = request.POST
        username = data.get("username")
        password = data.get("password")
        next_url = request.GET.get("next_url")
        if username == "dream" and password == "521":
            if next_url:
                obj = redirect(next_url)
            else:
                obj = HttpResponse("登陆成功")
            obj.set_cookie("sign", "666")
            return obj
        return HttpResponse("登录失败")
    return render(request, "login.html", locals())


def home(request):
    # 获取cookie"
    sign = request.COOKIES.get("sign")
    if sign and sign == "666":
        return HttpResponse("这是正常的home页面")
    return redirect("login")


def login_auth(func):
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        sign = request.COOKIES.get("sign")
        if sign and sign == "666":
            obj = func(request, *args, **kwargs)
            return obj
        return redirect(f"/login/?next_url={next_url}")

    return inner


# CBV加装饰器方式二 : 在类上面加 @method_decorator(装饰器函数名,指定给哪个视图函数加装饰器)
# @method_decorator(login_auth, "get")
class Index(View):
    # CBV加装装饰器的方式三 : 直接重写父类的 dispatch方法,但是这种方法有弊端,弊端就是所有的视图函数都会收到影响
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)

    # CBV 加装饰器方式一 : 直接在类视图上面 加 @method_decorator(装饰器函数名)
    # @method_decorator(login_auth)
    def get(self, request):
        return HttpResponse("这是正常的index页面")

标签:return,get,request,sign,Session,Cookie,cookie,login
From: https://www.cnblogs.com/Formerly/p/18102500

相关文章

  • openGauss Session性能诊断
    Session性能诊断可获得性本特性自openGauss1.0.0版本开始引入。特性简介Session性能诊断提供给用户Session级别的性能问题诊断。客户价值查看最近用户Session最耗资源的事件。查看最近比较占资源的SQL把资源都消耗在哪些等待事件上。查看最近比较耗资源的Session把资源......
  • Django框架之Cookie和Session
    【一】Cookie与Session介绍【1】早期的网站早期的很多网站可能都没有保存用户功能的需求,所有用户访问的返回结果都是一样的,如新闻,博客文章等等...但是互联网发展至今,已经有绝大多数网站,在你登录后反馈的页面和不登录反馈的页面已经是不一样的了,这些网站就用到了保存用户登录信......
  • Cookie复用的妙用:数据处理中的高效利器!
    简介浏览网站时,服务器会往浏览器发一些数据,叫做Cookie。它是一种认证数据,存储在电脑浏览器上,用于后续访问时身份验证和记录登录信息。通常,服务器会把一些关键信息如用户ID,会话ID,密码等存在Cookie里。Cookie相当于个人信息,浏览器请求页面时携带Cookie,这样服务器就能通过......
  • Django cookie与session,CBV如何添加装饰器
    cookie与session简介会话跟踪技术什么是会话跟踪?我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某......
  • cookie、session、token 区别
    title:cookie、session、token区别search:2024-03-20tags:“#cookie、session、token区别”cookie、session、token区别Tips:他们本质上是不同的,但是都跟维持状态信息有关一、三者在登录业务上的区别维持状态信息:当我们登录之后,如果我们希望后续所有的页面......
  • cookie一致性
    非跨域cookie一致性解决请求拦截器importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttppServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;@ComponentpublicclassCustomIntercepto......
  • Http-Only Cookie
    Http-OnlyCookie  设置Cookie的时候,如果服务器加上了HttpOnly属性,则这个Cookie无法被JavaScript读取(即document.cookie不会返回这个Cookie的值),只用于向服务器发送。Set-Cookie:key=value;HttpOnly上面的这个Cookie将无法用JavaScript获取。进行AJAX操作时,XMLHtt......
  • Koa项目总结五:Koa项目中cookie和session的配置和使用
    Koa项目总结五:Koa项目中cookie和session的配置和使用joyitsai关注IP属地:山东0.282019.05.2623:52:45字数1,326阅读2,4751.Cookie介绍:Cookie是保存在浏览器中的数据,可以让我们在同一个浏览器访问同一个域名时共享cookie数据。1.1使用cookie,可实现的几个常用场景:......
  • ASP.NET通过Appliaction和Session统计在人数和历史访问量
    目录背景:Appliaction:Session:过程:数据库:Application_Start:Session_Start:Session_End:Application_End:背景:事件何时激发Application_Start在调用当前应用程序目录(或子目录)的第一个ASP.NET页面时激发Applicaiotn_End在应用程序最后一次会话结束时激发,此外在使用I......
  • MyBatis3源码深度解析(十六)SqlSession的创建与执行(三)Mapper方法的调用过程
    文章目录前言5.9Mapper方法的调用过程5.10小结前言上一节【MyBatis3源码深度解析(十五)SqlSession的创建与执行(二)Mapper接口和XML配置文件的注册与获取】已经知道,调用SqlSession对象的getMapper(Class)方法,传入指定的Mapper接口对应的Class对象,即可获得一个动态......