網(wǎng)站首頁 編程語言 正文
引言
在已有的網(wǎng)站中,幾乎所有的網(wǎng)站都已經(jīng)實現(xiàn)了 自動登錄
所謂自動登錄,其實就是在你登錄后,然后關閉瀏覽器,接著再啟動瀏覽器重新進入剛剛的網(wǎng)站時,無需自己再次登錄。更準確的說,在一段時間內(nèi),無需自己再次登錄
思路:其實所謂的自動登錄,到最后的后端邏輯,和你正常的登錄邏輯是一樣的,也是判斷用戶名和密碼是否正確。只是我們要省略讓用戶再次輸入用戶名和密碼的步驟,那么肯定就要將用戶名和密碼存儲在一個地方。當檢測到用戶再次進入時,看看是否滿足可以自動登錄的條件,滿足的話,將保存的用戶名和密碼取出來,幫用戶自動登錄。那我們就要去想,將用戶名和密碼存儲到什么地方
在本篇文章中,本人會在 Flask 項目中使用 ** session + cookie** 的方式,實現(xiàn)上述的功能
實現(xiàn)的方式有很多種,下面的只是其中一種,大家可以自己的需求進行改造和拓展
1. 登錄時
登錄,前端傳來用戶名和密碼,然后去后端進行驗證。如果用戶名和密碼都正確,則正常登錄
此時,我們需要把用戶名、密碼存進 cookie 中,然后在 session 存儲一個是否已經(jīng)登錄的標識
重要的話說三次:
存儲密碼時,記得加密!
存儲密碼時,記得加密!
存儲密碼時,記得加密!
參考代碼如下
from flask import make_response, session, request
@user.route('/login', methods=['POST'])
def login():
username = request.form.get('username').strip()
password = request.form.get('password').strip()
...... // 自己的邏輯處理
if 登錄成功:
session['islogin'] = 'true' // 是否已經(jīng)登錄的標識
session['username'] = username // 根據(jù)自己的需求,在session里存儲一些值
# 將Cookie寫入瀏覽器
response = make_response('login-pass') // 登錄成功,返回給前端的值
response.set_cookie('username', username, max_age=30*24*3600) // max_age,cookie的存活時間,這里表示一個月
response.set_cookie('password', password, max_age=30*24*3600)
return response
else:
return 'login-fail' // 登錄失敗,返回給前端的值
2. 定義全局攔截器
這個時候,可能會有人有疑問,為什么要使用攔截器?
試想:進入一個網(wǎng)站有多個入口,你知道用戶會以哪個入口來訪問你的網(wǎng)站嗎?那我們總不能每一個進入網(wǎng)站的接口都去寫一份自動登錄的邏輯代碼吧。所以我們可以直接使用攔截器,將所有的請求都攔截起來,進行統(tǒng)一的處理。然后將靜態(tài)的資源和不用進行自動登錄邏輯處理的請求過濾掉即可
在程序的主入口 main.py 定義一個攔截器
# 定義全局攔截器,實現(xiàn)自動登錄
@app.before_request
def before():
url = request.path
pass_list = ['/user', '/login', 'logout'] // 不用進行自動登錄邏輯判斷的請求
if url in pass_list or url.endswith('.js') or url.endswith('.jpg'):
pass // 過濾不用進行自動登錄邏輯處理的請求和靜態(tài)的資源
else:
if session.get('islogin') is None:
username = request.cookies.get('username')
password = request.cookies.get('password')
if username != None and password != None:
...... // 自己的邏輯處理
if 登錄成功:
session['islogin'] = 'true' // 是否已經(jīng)登錄的標識
session['username'] = username // 根據(jù)自己的需求,在session里存儲一些值
3. 退出登錄時
退出登錄時,清空 session 和 cookie
from flask import make_response, session, request, url_for
@user.route('/logout')
def logout():
# 清空session和Cookie,頁面跳轉(zhuǎn)
session.clear()
response = make_response('注銷并進行重定向', 302) # 302狀態(tài)碼表示重定向
# 兩種重定向的方法
# response.headers['Location'] = '/'
response.headers['Location'] = url_for('index.home') # 另一種方式,括號里的值寫請求為“/” 的 - Blueprint名.方法名
# 兩種清除cookie的方式
response.delete_cookie('username')
response.set_cookie('password', '', max_age=0)
return response
上面第二種重定向方式中,所對應的值
index = Blueprint("index", __name__)
@index.route('/')
def home():
...... // 自己的邏輯處理
原文鏈接:https://blog.csdn.net/wanzijy/article/details/127455173
相關推薦
- 2024-03-08 Linux虛擬機輸入ifconfig不顯示IP地址解決方法
- 2022-10-31 C#實現(xiàn)HTTP訪問類HttpHelper的示例詳解_C#教程
- 2022-06-06 mui柵格布局的兩種方式(grid和list,宮格和列表)
- 2022-12-05 Go?reflect?反射原理示例詳解_Golang
- 2022-04-19 Python之random庫的常用函數(shù)有哪些_python
- 2022-05-01 jquery實現(xiàn)移動端按鈕組左右滑動_jquery
- 2022-07-15 SQL?Server中的游標介紹_MsSql
- 2022-11-14 值類型和引用類型的區(qū)別 I 數(shù)據(jù)結構中的堆和棧和內(nèi)存中的堆和棧的區(qū)別
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支