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