• Django学习笔记第十一篇--关于session


    一、session和sessionid:

    sessionid是cookie的一个字段,sessionid一般如下:

     1 """请求报文"""
     2 """
     3 GET /myapp1/session/ HTTP/1.1
     4 Host: 127.0.0.1:8000
     5 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0
     6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
     7 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
     8 Accept-Encoding: gzip, deflate
     9 Cookie: login_flag=1; login_name=admin; sessionid=wdsj0ug1yuy634xhqn0ln010ghwk3ofr
    10 Connection: close
    11 Upgrade-Insecure-Requests: 1
    12 Cache-Control: max-age=0
    13 """
    14 """"""

    这里要明确一个session是存在数据库后端的,cookie是存在客户端(用户)本地的。

    sessionid 并不只是可以名字是sessionid,也可以是sid,jsessionid,phpsessionid等等,再来看一个百度的:

     1 """
     2 GET / HTTP/1.1
     3 Host: www.baidu.com
     4 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0
     5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
     6 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
     7 Accept-Encoding: gzip, deflate
     8 Cookie: BAIDUID=8078C92C8DB5E9579911B40A626F655F:FG=1; BIDUPSID=8078C92C8DB5E9579911B40A626F655F; PSTM=1516783068; BD_HOME=0; H_PS_PSSID=1441_18194_21116_20928
     9 Connection: close
    10 Upgrade-Insecure-Requests: 1
    11 Cache-Control: max-age=0
    12 """

    来看看相关session的配置文件:

     1 #配置setting.py
     2 
     3 SESSION_COOKIE_NAME = "sessionid"      # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
     4 
     5 SESSION_COOKIE_PATH = "/"              # Session的cookie保存的路径(默认)
     6 
     7 SESSION_COOKIE_DOMAIN = None             # Session的cookie保存的域名(默认)
     8 
     9 SESSION_COOKIE_SECURE = False          # 是否Https传输cookie(默认)
    10 
    11 SESSION_COOKIE_HTTPONLY = True         # 是否Session的cookie只支持http传输(默认)
    12 
    13 SESSION_COOKIE_AGE = 1209600             # Session的cookie失效日期(2周)(默认)
    14 
    15 SESSION_EXPIRE_AT_BROWSER_CLOSE = False    # 是否关闭浏览器使得Session过期(默认)
    16 
    17 SESSION_SAVE_EVERY_REQUEST = False        # 是否每次请求都保存Session,默认修改之后才保存(默认)

    针对这些配置讲解如何才能更安全:

    1、session的路径建议单独保存,切不可再web服务上直接范文。

    2、对应的域要配置

    3、https肯定要支持

    4、过期时间建议不超过2h

    5、关闭浏览器过期是必须的

    服务器端需要用的很多东西就可以存储在session中而不是sessionid中!例如可以验证码的值存储在sessionid中

    例如一个验证码:

    可以通过某种图片方式传递到客户端,然后服务器端存储在session中,等待请求报文发过来验证:

     1 def verify(request):
     2     if request.method != 'POST':
     3         s = uuid.uuid1()
     4         s = str(s)
     5         content = {}
     6         content["code"] = s
     7         request.session["verifycode"] = s
     8         return render(request,"verify.html",content)
     9     else:
    10         if request.POST["code"] == request.session["verifycode"]:
    11             user = request.COOKIES.get("login_name")
    12             print user
    13             print request.COOKIES
    14             if user == None:
    15                 return HttpResponseRedirect("/myapp1/login")
    16             response = HttpResponseRedirect("/myapp1/mainpage?name=%s"%user)
    17             response.set_cookie("login_flag","1")
    18             return response

    可以总结出session的存取:

     1 #session的读:
     2 request.session["key_name"]
     3 #或者:
     4 request.session.get("key_name")
     5 request.session.get("key_name",None)
     6 
     7 #session的写:
     8 session["key"] = value
     9 
    10 """
    11 在Django中要用session中一定要先执行:
    12 
    13 python manage.py makemigrations
    14 
    15 python manage.py migrate
    16 """

    其他操作:

     1 request.session.setdefault('k1',123)  #存在则不设置
     2 del request.session['k1']  #删除键值对
     3 request.session.clear()    #删除session
     4 
     5 #所有 键、值、键值对
     6 request.session.keys()
     7 request.session.values()
     8 request.session.items()
     9 request.session.iterkeys()
    10 request.session.itervalues()
    11 request.session.iteritems()
    12 
    13 #用户session的随机字符串
    14 request.session.session_key
    15 #将所有Session失效日期小于当前日期的数据删除
    16 request.session.clear_expired()
    17 #检查 用户session的随机字符串 在数据库中是否
    18 request.session.exists("session_key")
    19 #删除当前用户的所有Session数据
    20 request.session.delete("session_key")
    21 request.session.set_expiry(value)
    22 #默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的
    23 #如果value是个整数,session会在些秒数后失效。
    24 #如果value是个datatime或timedelta,session就会在这个时间后失效。
    25 #如果value是0,用户关闭浏览器session就会失效。
    26 #如果value是None,session会依赖全局session失效策略。
  • 相关阅读:
    linux 常用awk命令
    plsql连接oralce数据的配置 PLSQL配置怎么连ORACLE plsql连接多个数据库设置 Oracle 服务命名(别名)的配置及原理,plsql连接用
    PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora原理解释
    OLEDB和ODBC的区别(优缺点)
    ADO,OLEDB,ODBC,DAO,RDO的区别说明
    Android开发在路上:少去踩坑,多走捷径
    手机淘宝构架演化实践
    车​险​与​非​车​险​基础分​类​和​说​明
    192.168.1.1地址,路由器地址打不开怎么办?
    一般测试流程 常用的软件测试工具有哪些? 开源测试工具 软件测试一般用到的工具、框架、技术列表
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8433943.html
Copyright © 2020-2023  润新知