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