java使用token防止用户重复登录以及验证用户登录

登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中

生成token的代码如下:

    @Overridepublic String createToken(String phone,String appId) throws Exception {long loginTime = DateUtil.getNowTimeStampTime().getTime();String str = String.valueOf(phone) + CommonConstant.COMMA_CHARACTER+appId+ CommonConstant.COMMA_CHARACTER+ String.valueOf(loginTime);byte[] cipherData = null;String result = null;cipherData = RSAEncrypt.encrypt(Rsa2Manager.getPublicKeyGmall(), str.getBytes("UTF-8"));//RSA加密result = Base64.encode(cipherData);//加密return result;}

checkToken,获取当前session,有效则已登录,无效则获取当前的token,解密token,再去查询redis中的token是否有效,有效则再次对session赋值,还原登录状态

@Overridepublic boolean isLogin(HttpSession session) throws Exception {boolean islogin = false;String appId = (String) session.getAttribute(UserConstant.LOGIN_APP_ID);String userId = (String) session.getAttribute(UserConstant.USER_SESSION_KEY);if (StringUtils.isNotBlank(appId) && StringUtils.isNotBlank(userId)) {islogin = true;} else {String phone ="";String appid ="";HttpServletRequest request = getCurrentThreadRequest();String currentToken = request.getHeader(CommonConstant.REQUEST_HEADER_TOKEN_NAME);if(StringUtils.isNotBlank(currentToken)){byte[] res = null;res = RSAEncrypt.decrypt(Rsa2Manager.getPrivateKeyGmall(), Base64.decode(currentToken));String restr = new String(res);String[] str = restr.split(",");phone = str[0];appid = str[1];String redisKey = CommonConstant.LOGIN_TOKEN.concat(phone);String token = RedisUtil.getRedisString(redisKey);if (StringUtils.isNotBlank(token)) {request.getSession().setAttribute(UserConstant.USER_SESSION_KEY, phone);request.getSession().setAttribute(UserConstant.LOGIN_APP_ID, appid);islogin = true;}else{islogin = false;}}}return islogin;}

  

转载于:https://www.cnblogs.com/ouyanxia/p/7490613.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

866. 试除法判定质数

试除法判定质数 #include<iostream> #include<cmath> using namespace std; bool cmp(int x) {if (x1) return false;for (int i2;i<sqrt(x);i){if (x%i0) return false;}return true; } int main() {int n,num;cin>>n;while (n--){cin>>num;bool …

python基础练习

1.简单输入输出交互。 oldinput(How old are you?\n) print(I am %s%old) 2.用户输入两个数字&#xff0c;计算并输出两个数字之和&#xff0c;尝试只用一行代码实现这个功能。 minput(输入第一个数字&#xff1a;) ninput(输入第二个数字&#xff1a;)sumfloat(m)float(n)pr…

867. 分解质因数

分解质因数 #include <iostream> #include <set> #include <map> #include <cmath> using namespace std; int main() {int n;cin >> n;for (int i 0; i < n; i){int num;map<int, int> mp;set<int> cun;cin >> num;for …

.Net AppDomain详解(一)

AppDomain是CLR的运行单元&#xff0c;它可以加载Assembly、创建对象以及执行程序。AppDomain是CLR实现代码隔离的基本机制。每一个AppDomain可以单独运行、停止&#xff1b;每个AppDomain有自己默认的异常处理&#xff1b;一个AppDomain的运行失败不会影响到其他的AppDomain。…

902. 最短编辑距离

最短编辑距离 #include <iostream> #include <algorithm> using namespace std; const int N 1001; int f[N][N]; int n, m; char w1[N], w2[N]; int main() {cin >> n >> w1 1;cin >> m >> w2 1;for (int i 0; i < m; i)f[0][i] …

Discuz!论坛实现帖子回复可见内容功能

自从Discuz&#xff01;升级到3.0以上的时候很多功能都被改版了&#xff0c;已不是2年前的设计&#xff0c;如果不是Discuz&#xff01;老用户还真不知道怎么玩它了。 博主以前经常逛论坛&#xff0c;但从来没有自己去做过一个论坛&#xff0c;相关的开源程序代码也不是怎么精通…

dropify,不错的图片上传预览插件

引言 传统的图片上传&#xff0c;很丑。点击选择之后&#xff0c;还无法预览。 有一种方案是传到服务器&#xff0c;然后返回地址&#xff0c;然后显示&#xff0c;比较麻烦。 用这个dropify&#xff0c;就可以解决之歌问题。 看效果 用法 1.引入文件,需要jquery支持。 <lin…

7-4 统计工龄 (20 分)(C语言实现)

7-4 统计工龄 (20 分) 给定公司N名员工的工龄&#xff0c;要求按工龄增序输出每个工龄段有多少员工。 输入格式: 输入首先给出正整数N&#xff08;≤10 ​5 ​​ &#xff09;&#xff0c;即员工总人数&#xff1b;随后给出N个整数&#xff0c;即每个员工的工龄&#xff0c;范…

【知了堂学习笔记】MySQL数据库常用的SQL语句整理

一&#xff0c;常用、简单的SQL操作语句 1.数据库操作&#xff1a; 1&#xff09;创建数据库&#xff1a; create database database_name&#xff1b; 创建并设置字符编码 create database database_name character set utf8&#xff1b; 2&#xff09;删除数据库&#xff1a…

7-1 模拟EXCEL排序 (25 分)

7-1 模拟EXCEL排序 (25 分) Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。 输入格式: 输入的第一行包含两个正整数N(≤10 ​5 ​​ ) 和C&#xff0c;其中N是纪录的条数&#xff0c;C是指定排序的列号。之后有 N行&#xff0c;每行包含一条学生纪录。每条…

tomcat原理解析(一):一个简单的实现

一 概述 前段时间去面试&#xff0c;被人问到了tomcat实现原理。由于平时没怎么关注容器的实现细节&#xff0c;这个问题基本没回答上来。所以最近花了很多时间一直在网上找资料和看tomcat的源码来研究里面处理一个HTTP请求的流程。网上讲tomcat的帖子比较多&#xff0c;大多都…

1065 A+B and C (64bit) (20 分)

1065 AB and C (64bit) (20 分) Given three integers A, B and C in [−2 ​63 ​​ ,2 ​63 ​​ ], you are supposed to tell whether AB>C. Input Specification: The first line of the input gives the positive number of test cases, T (≤10). Then T test cases…

7-3 寻找大富翁 (25 分)

7-3 寻找大富翁 (25 分) 胡润研究院的调查显示&#xff0c;截至2017年底&#xff0c;中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值&#xff0c;请快速找出资产排前M位的大富翁。输入格式: 输入首先给出两个正整数N&#xff08;≤10 ​6 ​​ &#…

7-8 德才论 (25 分)(C语言实现)

7-8 德才论 (25 分) 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c;…

899. 编辑距离

编辑距离 #include <iostream> #include <cstring> #include <algorithm> using namespace std; int f[1001][1001]; int main() {char ch[1001][13];int n, m;cin >> n >> m;for (int i 0; i < n; i){scanf("%s",ch[i]1);}while…

282. 石子合并

石子合并 #include<algorithm> #include<iostream> using namespace std; const int N 303; int f[N][N]; int s[N]; int main() {int n;cin>>n;for (int i1;i<n;i) cin>>s[i],s[i]s[i-1];for (int len 2;len<n;len)//len长度{for (int i1;il…

868. 筛质数

筛质数 埃及筛法&#xff1a; #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main() {int n,cnt0;bool p[1000010];memset(p,true,sizeof(p));cin>>n;for (int i1;i<n;i){if (p[i]true) cnt;for (int j ii…

870. 约数个数

约数个数 约数个数就是所有数的质因子的个数加一相乘 #include <iostream> #include <set> #include <map> #include <cmath> using namespace std; const int mod 1e9 7; int main() {map<int, int> mp;int n, m;cin >> n;while (n--)…

900. 整数划分

整数划分 两种方案&#xff1a; 第一种&#xff1a;f[i][j] f[i-1][j-1]f[i-j][j]//i表示数量&#xff0c;j表示分几个数 #include <iostream> using namespace std; const int N 1050; const int mod 1e9 7; int f[N][N]; int main() {int n;cin >> n;f[0][0…

3617. 子矩形计数

子矩形计数 #include <iostream> #include <cmath> using namespace std; int a[40041], b[40041]; //int num1[40041],num2[40041]; pair<int, int> f[40041]; int main() {int n, m, k;int num;cin >> n >> m >> k;int cou1 0, cou2 …