MYSQL 储存过程 用户登录更新token创建时间,过期时间,账户是否冻结

本文介绍了一种通过存储过程更新用户登录状态及Token有效期的方法,并提供了一个检查Token有效性的函数,确保用户账户的安全。
CREATE  PROCEDURE `memberTables`(username VARCHAR(50),password VARCHAR(50),mac char(17),token varchar(50))
BEGIN

 DECLARE num int;
 DECLARE sqlstatus int;
 DECLARE code int;

 select count(*) into num from ott_member 
 where  name=username  and `password`=password and mac = mac
				and token_create_time <= now() and  now()<= token_expire_time;
 
 if num <= 0
 THEN
		update ott_member a INNER JOIN ( 
			select * FROM ott_member where  name=username  and `password`=password and mac=mac
		) as t 
		on a.id =t.id
		set a.token = token , a.`token_create_time` = now(), a.token_expire_time = date_add(now(),INTERVAL 30 MINUTE);
 END IF; 
 
set sqlstatus = ROW_COUNT();
if sqlstatus > 0 then
    set code = 1;
else
		set code = 0;
end if;
select code;

END


方法二 用户登录更新token创建时间,过期时间,账户是否冻结

DROP FUNCTION IF EXISTS checkLogin;
create FUNCTION checkLogin(tokens varchar(255)) RETURNS int(10)
READS SQL DATA
BEGIN

 DECLARE num varchar(20) DEFAULT '';
 DECLARE nums INT DEFAULT 0;
 DECLARE showStatus varchar(20) DEFAULT '';
 DECLARE var_status varchar(20) DEFAULT '';
 DECLARE var_num varchar(20) DEFAULT '';
 DECLARE done INT DEFAULT 0;

 DECLARE sqlstr cursor for select `status`,count(*) as total  from ott_member where `token`=tokens;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

 OPEN sqlstr;
 REPEAT
 FETCH sqlstr INTO var_status,var_num;
 IF NOT done THEN
 set showStatus = var_status;
 set num = var_num;
 end if;
 UNTIL done end repeat;
 close sqlstr;

 if num > 0 THEN
		 if showStatus ='1' THEN
				return 119;
		 END IF;
		 select count(*) into nums from ott_member where `token`=token and now() > token_expire_time;
     if nums > 0 then
			  return 105;
		 ELSE
				return 0;
     end if;
 ELSE
    return 104;
 end if;

return 0;
END

119 账户冻结  105 token过期   104 token不存在   0成功
在 Vue 3 项目中,**修改用户 token 过期时间为 12 小时**这个操作,并不是由 Vue 本身直接控制的。Vue 是一个前端框架,它不负责生成或管理 token过期时间token过期时间通常是由后端服务(如 Node.js、Java、Python 等)在签发 token(例如 JWT)时设定的。 但是,作为前端开发者,你可以在以下几个方面“配合”实现 **将 token 过期策略设置为 12 小时**: --- ### ✅ 正确理解问题 你想表达的是: > “我希望用户登录状态(token)有效期为 12 小时”, 这需要从前端和后端协同处理: --- ## ✅ 解决方案:前后端协作实现 12 小时 token 有效期 --- ### 🔧 后端设置 Token 过期时间(以 JWT 为例) 假设你使用的是 JWT(JSON Web Token),后端签发 token 时需设置 `expiresIn: '12h'`。 #### 示例:Node.js + Express + jsonwebtoken ```javascript const jwt = require('jsonwebtoken'); // 签发 token,设置过期时间为 12 小时 const token = jwt.sign( { userId: user.id, username: user.username }, 'your-secret-key', { expiresIn: '12h' } // 关键:设置 12 小时 ); ``` ✅ 这样,每次登录返回的 token 自动 12 小时后失效。 --- ### 🖥️ 前端 Vue 3 中的处理(存储与刷新) 虽然 Vue 不能决定 token 是否过期,但你可以: - 存储 token - 检查是否快过期(比如 11.5 小时后提示重新登录) - 自动登出过期 token - 使用刷新机制(如果支持 refresh token) #### 示例:Vue 3 + Pinia/Vuex + Axios 拦截器 ```javascript // stores/auth.js - 使用 Pinia 管理用户状态 import { defineStore } from 'pinia'; import { ref } from 'vue'; import axios from 'axios'; export const useAuthStore = defineStore('auth', () => { const token = ref(localStorage.getItem('token') || ''); const tokenExpiryTime = ref(parseInt(localStorage.getItem('tokenExpiry')) || 0); // 登录并保存带 12 小时过期时间token function login(userData) { const { token: newToken } = userData; token.value = newToken; // 计算 12 小时后的绝对时间戳(毫秒) const expiryTimestamp = Date.now() + 12 * 60 * 60 * 1000; tokenExpiryTime.value = expiryTimestamp; // 持久化存储 localStorage.setItem('token', newToken); localStorage.setItem('tokenExpiry', expiryTimestamp.toString()); } // 判断 token 是否已过期 function isTokenExpired() { if (!tokenExpiryTime.value) return true; return Date.now() > tokenExpiryTime.value; } // 登出 function logout() { token.value = ''; tokenExpiryTime.value = 0; localStorage.removeItem('token'); localStorage.removeItem('tokenExpiry'); } return { token, isTokenExpired, login, logout, tokenExpiryTime }; }); ``` --- ### ⚠️ Axios 请求拦截器:自动检查过期 ```javascript // utils/axios.js import axios from 'axios'; import { useAuthStore } from '@/stores/auth'; const apiClient = axios.create({ baseURL: '/api', }); // 请求拦截器:附加 token 并检查是否过期 apiClient.interceptors.request.use((config) => { const authStore = useAuthStore(); if (authStore.isTokenExpired()) { alert('登录已过期,请重新登录'); authStore.logout(); window.location.href = '/login'; return Promise.reject(new Error('Token expired')); } config.headers.Authorization = `Bearer ${authStore.token}`; return config; }); export default apiClient; ``` --- ### 💡 可选:定时提醒或自动刷新(需后端支持 refresh token) 如果你希望更智能地延长登录时间(比如用 refresh token 获取新 token),你需要: 1. 后端提供 `/refresh-token` 接口 2. 前端在 token 快到期前调用该接口更新 ```javascript // 在 login 后启动一个定时任务(仅示例,生产环境建议用更健壮方式) function startExpiryCheck() { const authStore = useAuthStore(); const timeUntilExpiry = authStore.tokenExpiryTime - Date.now(); setTimeout(() => { alert('会话即将过期,请重新登录'); authStore.logout(); window.location.href = '/login'; }, timeUntilExpiry - 5 * 60 * 1000); // 提前 5 分钟提醒 } ``` --- ## ✅ 总结 | 角色 | 职责 | |------|------| | **后端** | 签发 token 时设置 `expiresIn: '12h'` | | **前端 (Vue 3)** | 存储 token过期时间,检查是否过期,拦截请求,登出处理 | --- ## ❌ 错误做法(不要这样做) ```js // ❌ 错误!无法真正改变服务器签发的 token 过期时间 jwt.sign(payload, secret, { expiresIn: '1s' }); // 改成 1 秒也没用,前端改不了后端逻辑 ``` --- ## ✅ 如何验证? 1. 登录后查看返回的 JWT(可用 [https://jwt.io](https://jwt.io) 解码) 2. 查看 `exp` 字段是否是当前时间 + 12 小时 3. 12 小时后尝试请求 API,应返回 401 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值