• cookie和session


    一.cookie

    1.cookie的简单认识

    http是无状态的,Cookies是作为http的一个扩展诞生的,其主要用途是弥补http的无状态特性。提供了一种保持客户端与服务器端之间状态的途径。

    在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。

    2.cookie原理

    浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容(set_cookie),浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

    3.Djanog设置cookie实例

    <form action="/login/" method="POST">
        <p>用户名<input type="text" name="username"></p>
        <p>密码<input type="password" name="password"></p>
        <p><input type="submit"></p>
    </form>
     
     
    -------------index.html
    <h1>hhhhh</h1>
    {{ user }}
    -------------urls.py
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/',views.login),
        path('index/',views.index),
    ]
     
    --------------views.py
    def login(req):
        if req.method=="POST":
            user=req.POST.get("username")
            pwd=req.POST.get("password")
            if user=="root" and pwd=="root":
                rep=redirect("/index")                              #redirect参数是找urls.py中的url
                rep.set_cookie("username",user,max_age=10)          #设置cookie
                return rep                                          #返回index.html界面
        return render(req,"login.html")
    def index(req):
        user=req.COOKIES.get("username")                            #从cookie中取数据,如果cookie已经存在,在浏览器直接输入127.0.0.1:8000/index就会直接返回index.html界面
        if user:                                                    #如果cookie中有数据就返回index.html界面
            return render(req,"index.html",{"user":user})
        else:
            return redirect("/login")              
     
    一般我们都是从登陆界面输入账号密码后进入index.html界面,这时已经创建好了cookie,在index函数中直接取cookie就行了,但是如果cookie已经存在(login函数执行过了),在浏览器直接输入127.0.0.1:8000/index就会直接返回index.html界面 
    

    获取cookie

    request.COOKIES['key']
    

    设置cookie

    rep = HttpResponse(...)
    rep = render(request, ...)
     
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
    

    删除cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
        return rep
    

    4.通过js设置cookie

    document.cookie = "k1=wyxx;path=/"
    

    5.通过jquery设置cookie

    1.引入jquery.js

    <script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
    

    2.引入jquery cookie插件

    <script src="//cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>  

    3.调用插件封装好的方法

    a)设置新的cookie:

    $.cookie('name','dumplings');  //设置一个值为'dumplings'的cookie
    设置cookie的生命周期
    

    $.cookie('key', 'value', { expires: 7 }); //设置为7天,默认值:浏览器关闭

    设置cookie的域名:
    $.cookie('name','dumplings', {domain:'qq.com'});   //设置一个值为'dumplings'的在域名'qq.com'的cookie
    

    设置cookie的路径:

    $.cookie('name','dumplings', {domain:'qq.com',path:'/'});  
    //设置一个值为'dumplings'的在域名'qq.com'的路径为'/'的cookie
    

    b)删除cookie

    $.removeCookie('name',{ path: '/'}); //path为指定路径,直接删除该路径下的cookie
    $.cookie('name',null,{ path: '/'}); //将cookie名为‘openid’的值设置为空,实际已删除
    

    c)获取cookie

    $.cookie('name')   //dumplings
    

      

    二.session

    1.简单认识

    Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

    是一种存储数据的方式,依赖于cookie。

    2.实现本质

    用户向服务端发送请求,服务端做两件事
    1.生成随机字符串;
    2.为此用户开辟一个独立的空间来存放当前用户独有的值

    3.Django设置session实例

    from django.shortcuts import render,redirect
     
    # Create your views here.
    def login(req):
        if req.method == "POST":
            username = req.POST.get("user")
            password = req.POST.get("pwd")
            if username == "alex" and password =="alex123":
                req.session['user_name'] = "jjjj"
                req.session['user_pwd'] = "xxww"
                return redirect("/index/")
        return render(req,"login.html")
    def index(req):
        if req.session['user_name'] == 'jjjj': 
        #if req.session。get('user_name') == 'jjjj': 
            return render(req,"index.html")
        else:
            return render(req,"login.html")
    

    获取session

    request.session['k1']
    request.session.get('k1',None) #request.session这句是帮你从浏览器的cookies里面将sessionid的值fgs423td取出来,将django-session表里面session_key字段的值为此fgs423td的对应那条记录中的session-data字段的数据给你拿出来(并解密),get方法就取出k1这个键对应的值
    

    设置session

    #设置值的时候生成随机字符串(假设为fgs423td),默认在django-session表中添加三个字段值(session_key,session_data,expire_date)分别为(fgs423td,加密后的{k1:123},过期时间),将随机字符串以{sessonid:fgs423td}形式返回给浏览器
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    

    删除session

    del request.session['k1']  #django-session表里面同步删除
    request.session.flush()
    

    其他操作

    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
     
     
    # 会话session的key
    session_key = request.session.session_key  获取sessionid的值
     
    # 将所有Session失效日期小于当前日期的数据删除,将过期的删除
    request.session.clear_expired()
     
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key") #session_key就是那个sessionid的值
     
    # 删除当前会话的所有Session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush()  #常用,清空所有cookie---删除session表里的这个会话的记录,
        这用于确保前面的会话数据不可以再次被用户的浏览器访问
        例如,django.contrib.auth.logout() 函数中就会调用它。
     
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。

    4.Django中session配置

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
     
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
     
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
     
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
     
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
     
    其他公用设置项:
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
    

      

  • 相关阅读:
    JavaScript对象创建的几种方式
    【应知应会】15个常用的JavaScript字符串操作方法
    JFreeChart 之折线图
    JFreeChart 之饼图
    百度 Echart 的使用
    UEditor 的使用
    获取中文汉字字符串相应的拼音和首字母的大小写
    Java 操纵XML之修改XML文件
    Java 操纵XML之读取XML文件
    Java 操纵XML之创建XML文件
  • 原文地址:https://www.cnblogs.com/ly0123/p/11938564.html
Copyright © 2020-2023  润新知