背景
最近在編寫一個(gè)django課程教務(wù)系統(tǒng)达传,涉及到多頁面帶登錄態(tài)的相互跳轉(zhuǎn),故記錄哈實(shí)戰(zhàn)過程中一些收獲劳吠。
實(shí)戰(zhàn)收獲
利用cookie字段判斷用戶是否已經(jīng)登錄
1.http協(xié)議本身是"無狀態(tài)"的引润,服務(wù)器需要借助于cookie和session字段來記錄客戶端的訪問狀態(tài),即保持登錄態(tài)
2.cookie是將一段文本保存在客戶端(瀏覽器或本地電腦)的一種技術(shù)痒玩,可長時(shí)間保存淳附。用戶首次通過客戶端訪問服務(wù)器時(shí),服務(wù)器會(huì)給客戶端發(fā)送一小段信息蠢古,客戶端需要將這段信息以cookie的形式保存在本地某個(gè)目錄的文件內(nèi)奴曙。
3.cookie的缺點(diǎn)在于不可靠和不安全:
1)瀏覽器可能不會(huì)保存服務(wù)器的cookie(依用戶習(xí)慣選擇)
2)cookie是有生命周期的(通過Expire設(shè)置)
3)http數(shù)據(jù)是明文發(fā)送,容易受到攻擊草讶,不能存放敏感數(shù)據(jù)洽糟;而且由于cookie是存放在文件中,可隨便修改
js代碼:
$.get(url, {'username': username, 'password':password}, function(data){
var data=JSON.parse(data);
if (data.errorCode==0){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
location.href= "{% url 'Mypage:homepage' %}"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//后端完成用戶名和密碼校驗(yàn)無誤后堕战,重定向到homepage主頁? ? ? ? ? ? ? ?
}
else{
alert(data.errorsList);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //后端校驗(yàn)用戶名或者密碼有誤坤溃,直接彈窗提示錯(cuò)誤信息
}
})
views.py代碼【設(shè)置cookie】
response.set_cookie("username", username)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//設(shè)置cookie字段
username = request.COOKIES.get('username')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//獲取cookie,獲取用戶發(fā)來請求中的cookie字段
利用session字段判斷用戶是否已經(jīng)登錄
session功能與應(yīng)用場景與cookie類似践啄,但由于數(shù)據(jù)是存儲(chǔ)在服務(wù)器上浇雹,會(huì)比cookie安全,就算用戶關(guān)閉了瀏覽器屿讽,session依舊可以保持到會(huì)話過期昭灵。
Session工作的流程如下:
1)客戶端向服務(wù)器發(fā)送請求時(shí),看本地是否有cookie文件伐谈。如果有烂完,就在HTTP的請求頭(Request Headers)中,包含一行cookie信息
2)服務(wù)器接收到請求后诵棵,根據(jù)cookie信息抠蚣,得到sessionId,根據(jù)sessionId找到對應(yīng)的session履澳,用這個(gè)session就能判斷出用戶是否登錄
js代碼:
$.get(url, {'username': username, 'password':password}, function(data){
var data=JSON.parse(data);
if (data.errorCode==0){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
location.href= "{% url 'Mypage:homepage' %}"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//后端完成用戶名和密碼校驗(yàn)無誤后嘶窄,重定向到homepage主頁? ? ? ? ? ? ? ?
}
else{
alert(data.errorsList);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //后端校驗(yàn)用戶名或者密碼有誤怀跛,直接彈窗提示錯(cuò)誤信息
}
})
views.py代碼【設(shè)置session】
request.session['is_login'] ='true'
request.session['username'] = username? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //將username寫入session,存入服務(wù)器
username = request.session.get('username')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //獲取session中username
ps.鏈接重定向可用response = HttpResponseRedirect('/user/index/')