會話跟蹤技術
- 在一個會話的多個請求中共享數據
- 會話路徑技術使用Cookie或session完成
- HTTP協議是無狀態協議,也就是說每一個請求都是獨立的!沒法記錄前一次請求的狀態。但HTTP協議中可使用Cookie來完成會話跟蹤!在Web開發中,使用session來完成會話跟蹤,session底層依賴Cookie技術。
Cookie
Cookie是由服務器建立,經過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,並會標註出Cookie的來源(哪一個服務器的Cookie),當客戶端向服務器發出請求時會把全部這個服務器Cookie包含在請求中發送給服務器,這樣服務器就能夠識別客戶端了!html
- 不一樣瀏覽器之間是不共享Cookie的
- 保存在瀏覽器端「鍵值對」
- 服務端能夠向用戶瀏覽器端寫cookie
- 客戶端每次方請求時,會攜帶cookie去
- 具體一個瀏覽器,針對一個服務器的存值
![](http://static.javashuo.com/static/loading.gif)
''' class HttpResponseBase: def set_cookie(self, key, 鍵 value='', 值 max_age=None, 超長時間 cookie須要延續的時間(以秒爲單位) 若是參數是\ None`` ,這個cookie會延續到瀏覽器關閉爲止。 expires=None, 超長時間 expires默認None ,cookie失效的實際日期/時間。 path='/', Cookie生效的路徑, 瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣能夠避免將 cookie傳給站點中的其餘的應用。 / 表示根路徑,特殊的:根路徑的cookie能夠被任何url的頁面訪問 domain=None, Cookie生效的域名 你可用這個參數來構造一個跨站cookie。 如, domain=".example.com" 所構造的cookie對下面這些站點都是可讀的: www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。 若是該參數設置爲 None ,cookie只能由設置它的站點讀取。 secure=False, 若是設置爲 True ,瀏覽器將經過HTTPS來回傳cookie。 httponly=False 只能http協議傳輸,沒法被JavaScript獲取 (不是絕對,底層抓包能夠獲取到也能夠被覆蓋) ): pass ''' 獲取cookie: request.COOKIES 刪除cookie:response.delete_cookie("cookie_key",path="/",domain=name)
1、django中cookie語法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 設置cookie rep.set_cookie(key,value,...)
# response = HttpResponse(...) 或 response = render(request, ...) 或 response = redirect()
response
=
HttpResponse(
"登陸成功!"
)
response.set_cookie(
"is_login"
,
True
)
response.set_cookie(
"username"
, user.user, path
=
"/index/"
)
import
datetime
now
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
response.set_cookie(
"last_visit_time"
, now)
# 獲取cookie:
is_login
=
request.COOKIES.get(
"is_login"
)
username
=
request.COOKIES.get(
"username"
)
last_visit_time
=
request.COOKIES.get(
"last_visit_time"
, "")
# cookie簽名:
# response = HttpResponse(...) 或 response = render(request, ...) 或 response = redirect()
response
=
HttpResponse(
"登陸成功!"
)
response.set_signed_cookie(
'ticket'
,
"123123"
, salt
=
'加密鹽'
)
request.get_signed_cookie(
'ticket'
,salt
=
'加密鹽'
)
|
Session
Session是服務器端技術,利用這個技術,服務器在運行時能夠爲每個用戶的瀏覽器建立一個其獨享的session對象,因爲 session爲用戶瀏覽器獨享,因此用戶在訪問服務器的web資源時 ,能夠把各自的數據放在各自的session中,當用戶再去訪問該服務器中的其它web資源時,其它web資源再從用戶各自的session中 取出數據爲用戶服務。python
- 保存在服務端的數據(本質是鍵值對)
- 敏感信息不會直接給客戶端
- 依賴cookie
- 當用戶來登陸的時候,服務端生成隨機字符串給客戶端的瀏覽器,瀏覽器寫到cookie裏面, 服務器端把這個隨機字符串保存裏面,讓這個隨機字符串能夠對應一些值,這些值就屬於用戶,每一個用戶就是一個隨機字符串
![](http://static.javashuo.com/static/loading.gif)
1、設置Sessions值 request.session['session_name'] ="admin" 2、獲取Sessions值 session_name = request.session["session_name"] 3、刪除Sessions值 del request.session["session_name"] 4、flush() 刪除當前的會話數據並刪除會話的Cookie。 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問 五、get(key, default=None) fav_color = request.session.get('fav_color', 'red') 6、pop(key) fav_color = request.session.pop('fav_color') 7、keys() 8、items() 9、setdefault() 10 用戶session的隨機字符串 request.session.session_key # 將全部Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查 用戶session的隨機字符串 在數據庫中是否 request.session.exists("session_key") # 刪除當前用戶的全部Session數據 request.session.delete("session_key") request.session.set_expiry(value) * 若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。
1、django中session語法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
'''
#設置session
if request.COOKIE.get("sessionid"):
更新
在django—session表中建立一條記錄:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t 更新數據
else:
1 生成隨機字符串 ltv8zy1kh5lxj1if1fcs2pqwodumr45t
2 經過cookie發送給客戶端 response.set_cookie("sessionid",ltv8zy1kh5lxj1if1fcs2pqwodumr45t)
3 服務端保存 在django—session表中建立一條記錄:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t {"is_login":True,"username":"yuan"}
{
隨機字符串1: {'username':'bubu','email':x''...}
}
'''
request.session[
"is_login"
]
=
True
request.session[
"username"
]
=
user.user
request.session.setdefault(
'k1'
,
123
)
# 存在則不設置
import
datetime
now
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
request.session[
"last_visit_time"
]
=
now
'''
#獲取session:
1 獲取客戶端cookie中的隨機字符串 request.COOKIE.get("sessionid") # ltv8zy1kh5lxj1if1fcs2pqwodumr45t
2 去session中查找有沒有隨機字符 django-session表中查找記錄:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t {"is_login":True,"username":"yuan"}
obj=django—session.objects .filter(session-key=ltv8zy1kh5lxj1if1fcs2pqwodumr45t).first()
3 去session對應key的value中查看是否有 is_login obj.session-data.get("is_login")
'''
is_login
=
request.session.get(
"is_login"
,
None
)
username
=
request.session.get(
"username"
,
None
)
last_visit_time
=
request.session.get(
"last_visit_time"
,
None
)
#其餘
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用戶session的隨機字符串
session_key
=
request.session.session_key
'''
#刪除session
1 randon_str=request.COOKIE.get("sessionid")
2 django-session.objects.filter(session-key=randon_str).delete()
3 response.delete_cookie("sessionid",randon_str)
'''
request.session.flush()
#所有刪除(完成上面3步) 推薦使用
del
request.session[
'k1'
]
#刪除的是隨機字符串裏面的k1
|
2、Django的session配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
"""
# settings.py中配置
Django默認支持Session,而且默認是將Session數據存儲在數據庫中,即:django_session表中。提供了5種類型的Session
"""
#1.數據庫
SESSION_ENGINE
=
'django.contrib.sessions.backends.db'
# 引擎(默認)
#2.緩存
SESSION_ENGINE
=
'django.contrib.sessions.backends.cache'
# 引擎
SESSION_CACHE_ALIAS
=
'default'
# 要配合Django緩存配置
# 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置
#3.文件
SESSION_ENGINE
=
'django.contrib.sessions.backends.file'
# 引擎
SESSION_FILE_PATH
=
None
# 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
#4.緩存+數據庫
SESSION_ENGINE
=
'django.contrib.sessions.backends.cached_db'
# 引擎
#5.加密cookie 基本沒有用
SESSION_ENGINE
=
'django.contrib.sessions.backends.signed_cookies'
# 引擎
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_HTTPONLY
=
True
# 是否Session的cookie只支持http傳輸(默認)
SESSION_COOKIE_AGE
=
1209600
# Session的cookie失效日期(2周)(默認)
SESSION_EXPIRE_AT_BROWSER_CLOSE
=
False
# 是否關閉瀏覽器使得Session過時(默認)
SESSION_SAVE_EVERY_REQUEST
=
True
# (每次刷新更新時間) 是否每次請求都保存Session,默認修改以後才保存(默認)
|
練習
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
from
django.shortcuts
import
render, HttpResponse, redirect
from
app01.models
import
UserInfo
def
login(request):
if
request.method
=
=
"POST"
:
user
=
request.POST.get(
"user"
)
pwd
=
request.POST.get(
"pwd"
)
user
=
UserInfo.objects.
filter
(user
=
user, pwd
=
pwd).first()
if
user:
#===================設置cookie===================
response
=
HttpResponse(
"登陸成功!"
)
response.set_cookie(
"is_login"
,
True
)
response.set_cookie(
"username"
, user.user, path
=
"/index/"
)
import
datetime
last_visit_time
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
response.set_cookie(
"last_visit_time"
,last_visit_time)
# cookie簽名:
# response.set_signed_cookie('ticket', "123123", salt='加密鹽')
# request.get_signed_cookie('ticket',salt='加密鹽')
#過時時間
# response.set_cookie("is_login",True,max_age=15)
# date=datetime.datetime(year=2019,month=5,day=29,hour=14,minute=34)
# response.set_cookie("username",user.user,expires=date)
return
response
#===================end 設置cookie===================
# ===================設置session===================
import
datetime
last_visit_time
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
# request.session["is_login"] = True
# request.session["username"] = user.user
# request.session["last_visit_time"] = last_visit_time
request.session[
'user_info'
]
=
{
'is_login'
:
True
,
'username'
: user.user,
'last_visit_time'
: last_visit_time}
return
HttpResponse(
"登陸成功!"
)
# ===================end 設置session===================
return
render(request,
"login.html"
)
def
index(request):
# ===================獲取cookie===================
is_login
=
request.COOKIES.get(
"is_login"
)
if
is_login:
username
=
request.COOKIES.get(
"username"
)
last_visit_time
=
request.COOKIES.get(
"last_visit_time"
, "")
return
render(request,
"index.html"
, {
"username"
: username,
"last_visit_time"
: last_visit_time})
# ===================end 獲取cookie===================
# ===================獲取session===================
is_login
=
request.session.get(
"user_info"
).get(
"is_login"
,
None
)
if
is_login:
username
=
request.session.get(
"user_info"
).get(
"username"
)
last_visit_time
=
request.session.get(
"user_info"
).get(
"last_visit_time"
)
return
render(request,
"index.html"
, {
"username"
: username,
"last_visit_time"
: last_visit_time})
# ===================end 獲取session===================
else
:
return
redirect(
"/login/"
)
def
logout(request):
request.session.flush()
return
redirect(
"/login/"
)
|