学丁

博客园 首页 联系 订阅 管理

一、Cookie基础知识

  1、实质:就是保存在浏览器端的键值对

  2、用途:主要做登录

  3、属性

    1)保存在用户浏览器
    2)可以主动清除
    3)可以被“伪造”
    4)跨域名cookie不共享
    5)浏览器可以设置接受cookie(京东登录不上)

二、代码(实现登录)

  1、Django下的urls代码

1 from django.contrib import admin
2 from django.urls import path
3 from resort import views
4 urlpatterns = [
5     path('admin/', admin.site.urls),
6     path('login/', views.login),
7     path('index/', views.index),
8 
9 ]
View Code

  2、Django下的view代码

 1 from django.shortcuts import render,HttpResponse,redirect
 2 
 3 # Create your views here.
 4 
 5 
 6 def login(req):
 7     if req.method == "POST":
 8         user = req.POST.get('username')
 9         pwd = req.POST.get('pwd')
10         if user == 'root' and pwd == 'root':
11             rep = redirect('/index')
12             rep.set_cookie('username',user)
13             return rep
14         else:
15             return render(req,'login.html')
16 
17     return render(req,'login.html')
18 
19 def index(req):
20     username = req.COOKIES.get('username')
21     if username:
22         return render(req,'index.html')
23         # 这里如果使用redirect会出现重定向问题,未解决原因,不断的登录
24     else:
25         return render(req,'login.html')
View Code

  3、Django下的template代码

    1)index页面

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <p>hello</p>
 9 </body>
10 </html>
View Code

    2)login页面

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9 <form action='/login/'  method="POST">
10 
11     用户名:<input type="text" name="username">
12 密码:<input type="password" name="pwd">
13 <button>提交</button>
14 
15 </form>
16 
17 
18 </body>
19 </html>
View Code

  4、参数

    1)可以设置多个Cookie值

     rep = redirect('/index')

       rep.set_cookie('username',user)    

       rep.set_cookie('email',user+'@163.com')

          return rep

    2)多个参数      

          def  set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                                   domain=None, secure=False, httponly=False):
        第一个参数:键
        第二个参数:值
        第三个参数:设置cookie的有限期
        第四个参数:不同浏览器之间设置cookie的有效期,比如IE
        第五个参数:设置规定地址下的cookie值
        第六个参数:设置主域(待完善)
        第七个参数:设置安全性(待完善)
        第八个参数:(待完善)

三、总结

  1、Cookie三个重要点:

    --客户端设置
    --服务端设置
    --保存在客户端
  2、Cookie的应用:
    登录认证
      普通cookie
        --敏感信息(直接看到),不宜防止在cookie中,敏感信息放在数据库,频繁操作
      签名的cookie
        --敏感信息(可能会解密)            

rep = redirect('/index.html/')         
rep.set_signed_cookie('username',username)           
return rep
--------------------------------
username = req.get_signed_cookie('username')
View Code

 

注:以上两个都不宜使用,敏感信息还是要放在数据库中,频繁操作有负担。所以Cookie做认证时,要将不敏感的信息放在Cookie中,但是对数据库还有负担,所以用Session解决

 

 


 

 

一、Session相关知识

  1、Session原理 

    服务器端保存的:

      以随机字符串为键构成的字典
      session = {
        adsf:{
          ‘is_login’ : 'True',
          'user' : 'user01'
          'nid' : '123'
          }
        qwer : {
          ‘is_login’ : 'True',
          'user' : 'user02'
          'nid' : '456'
          }
          }
    客户端保存的:

      随机字符串
      adsf,qwer

  2、cookie和session对比

  3、session存储配置(补充)

      · 数据库

      · 缓存

      · 文件

      · 缓存+数据库

      · 加密cookie

  4、示例:实现两周自动登陆

      ——request.session.set_expiry(60*10)
      ——SESSION_SAVE_EVERY_REQUEST = True
      PS:cookie中不设置超时时间,则表示关闭浏览器自动清除

  5、Session的操作语句

      request.session['k1']
      request.session.get('k1',None)

      request.session['k1'] = 123
      request.session.setdefault('k1',123) # 存在则不设置

      del request.session['k1']

      # 所有 键、 值、 键值对 操作
      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.clear_expired()

      # 检查 用户session的随机字符串 在数据库中是否存在
      request.session.delete('session_key')

      request.session.set_expiry(value)
       * 如果value是个整数,session会在这些秒后失效
       * 如果value是个datatime或timedelta,session就会在这个时间后失效
       * 如果value是None,session会依赖全局session失效策略。

  6、Session的默认配置

    Session在setting.py文件中的配置
    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_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)


二、代码(实现登录、注销、10秒免登录为例)

  1、Django下的urls代码

 

1 from django.contrib import admin
2 from django.urls import path
3 from app01 import views
4 urlpatterns = [
5     path('admin/', admin.site.urls),
6     path('login/', views.login),
7     path('index/', views.index),
8     path('logout/', views.logout),
9 ]
View Code

 

  2、Django下的view代码

 

 1 from django.shortcuts import render,redirect,HttpResponse
 2 
 3 # Create your views here.
 4 
 5 def login(request):
 6     if request.method == "GET":
 7         return render(request,'login.html')
 8     elif request.method == 'POST':
 9         user = request.POST.get('username')
10         pwd = request.POST.get('pwd')
11         if user == 'root' and pwd == '123':
12             # 生成随机字符串
13             # 写到用户浏览器cookie
14             # 保存到session中
15             # 在随机字符串对应的字典中设置相关内容
16             request.session['username'] = user
17             request.session['is_login'] = True
18             if request.POST.get('rmb',None) == '1': # 注意这里的引号
19                 request.session.set_expiry(10)
20                 # 人为的设置一下超时时间
21             return redirect('/index/')
22         else:
23             return render(request,'login.html')
24 
25 
26 def index(request):
27     # 获取每一个当前用户的随机字符串
28     # 根据随机字符串获取对应信息
29     # if request.session['is_login']: 用这个第一次跳到index时会报错,改为下面
30     if request.session.get('username',None):
31         return render(request,'index.html')
32     else:
33         return render(request,'login.html')
34 
35 def logout(request):
36     request.session.clear()
37     return redirect('/login/')
View Code

 

  3、Django下的template代码

    1)index页面

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>欢迎:{{ request.session.username }} :登录</h1>
 9 <a href="/logout/">注销</a>
10 </body>
11 </html>
View Code

 

    2)login页面

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <form action="/login/" method="POST">
 9 
10     <input type="text" name="username">
11     <input type="password" name="pwd">
12     <input type="checkbox" name="rmb" value="1">10秒免登录
13     <input type="submit" value="提交">
14 
15 </form>
16 
17 </body>
18 </html>
View Code

 

posted on 2018-09-04 20:05  学丁  阅读(149)  评论(0)    收藏  举报