一、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失效策略。