电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java令牌Token登錄與退出的實現(xiàn)

瀏覽:6日期:2022-09-01 09:28:53

Token

之前的博客已經(jīng)介紹了各種登錄的方式,現(xiàn)在直接介紹一種現(xiàn)在比較流行的登錄方式,無狀態(tài)登錄,只需要客戶端攜帶令牌就能登陸,服務器不再存儲登錄狀態(tài)。突然粉絲量爆棚,開心死了,所以抓緊寫一篇硬核代碼,分享給大家,拿來即用的代碼,直接copy即可。

使用之前需要配置一下xml

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --><dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version></dependency>

下面為Java代碼

package com.caeser.midrug.util;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.apache.commons.lang3.time.DateUtils;import com.auth0.jwt.JWT;import com.auth0.jwt.JWTCreator;import com.auth0.jwt.JWTVerifier;import com.auth0.jwt.algorithms.Algorithm;import com.auth0.jwt.interfaces.Claim;import com.auth0.jwt.interfaces.DecodedJWT;import com.google.common.collect.Maps;public class JwtHelper { private static final String SECRET = 'secret'; private static final String ISSURE= 'caeser'; public static String getToken(Map<String, String> claims) { Algorithm algorithm = Algorithm.HMAC256(SECRET); JWTCreator.Builder builder= JWT.create().withIssuer(ISSURE).withExpiresAt(DateUtils.addMinutes(new Date(), 3)); claims.forEach((k,v) ->builder.withClaim(k, v)); return builder.sign(algorithm).toString(); } public static String getTokenByMinute(Map<String, String> claims,int minute) { Algorithm algorithm = Algorithm.HMAC256(SECRET); JWTCreator.Builder builder= JWT.create().withIssuer(ISSURE).withExpiresAt(DateUtils.addMinutes(new Date(), minute)); claims.forEach((k,v) ->builder.withClaim(k, v)); return builder.sign(algorithm).toString(); } public static String getTokenByHour(Map<String, String> claims,int hour) { Algorithm algorithm = Algorithm.HMAC256(SECRET); JWTCreator.Builder builder= JWT.create().withIssuer(ISSURE).withExpiresAt(DateUtils.addHours(new Date(), hour)); claims.forEach((k,v) ->builder.withClaim(k, v)); return builder.sign(algorithm).toString(); } public static Map<String, String> verifyToken(String token){ Algorithm algorithm = Algorithm.HMAC256(SECRET); JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSURE).build(); DecodedJWT jwt =verifier.verify(token); Map<String, Claim> map = jwt.getClaims(); Map<String, String> resultMap = Maps.newHashMap(); map.forEach((k,v)->resultMap.put(k,v.asString())); return resultMap; } public static void main(String[] args) { }}

解釋

這段代碼其實非常簡單,作為調包俠的我們,只需要如何設置這個token生成就行了,我自己封裝了一個按分鐘和按小時校驗過期的方法。當獲取到登錄名密碼后,我們校驗通過,就可以對該用戶生成一個token然后返回給前端就行了。

package com.caeser.midrug.service.impl;import java.util.HashMap;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.caeser.midrug.dao.UserAuthDao;import com.caeser.midrug.dto.Meta;import com.caeser.midrug.dto.UserAuthExe;import com.caeser.midrug.entity.UserAuth;import com.caeser.midrug.enums.UserAuthEnum;import com.caeser.midrug.service.UserAuthService;import com.caeser.midrug.util.JwtHelper;import com.caeser.midrug.util.MD5;import com.caeser.midrug.util.StaticVariable;@Servicepublic class UserAuthServiceImpl implements UserAuthService{ @Autowired UserAuthDao userAuthDao; @Override public UserAuthExe getAuth(String account,String password) { UserAuthExe userAuthExe=new UserAuthExe(); Meta meta=new Meta(); // 將傳過來的密碼進行MD5加密 String inputPwd=MD5.getMd5(password); // 將賬號與數(shù)據(jù)庫內匹配 UserAuth dbAuth=userAuthDao.getPwdByAccount(account); if(dbAuth==null) { // 如果賬號不存在 meta.setMsg(UserAuthEnum.ACCOUNT_NONE.getStateInfo()); meta.setStatus(UserAuthEnum.ACCOUNT_NONE.getState()); } if(dbAuth!=null) { // 賬號存在 // 判斷密碼是否正確 if(dbAuth.getPassword().equals(inputPwd)) { // 密碼正確 Map<String, String> claim=new HashMap<String, String>(); // 存儲賬號密碼 claim.put('account', account); claim.put('password', password); // 賬號密碼保存到token String token=JwtHelper.getTokenByMinute(claim, StaticVariable.LOGINTIME_MINUTE); // 將token存儲到返回結果 userAuthExe.setToken(token); // 將用戶信息保存到返回結果 // 返回賬號 userAuthExe.setAcccount(account); // 返回用戶名 userAuthExe.setUserName(dbAuth.getUserName()); // 返回驗證成功信息 meta.setMsg(UserAuthEnum.SUCCESS.getStateInfo()); meta.setStatus(UserAuthEnum.SUCCESS.getState()); }else { // 密碼錯誤 meta.setMsg(UserAuthEnum.PWD_ERROR.getStateInfo()); meta.setStatus(UserAuthEnum.PWD_ERROR.getState()); } } // 存貯返回狀態(tài) userAuthExe.setMeta(meta); return userAuthExe; }}

其中有一串代碼需要大家注意,雖然我的注釋很全了,但是也要分清重點。

String token=JwtHelper.getTokenByMinute(claim, StaticVariable.LOGINTIME_MINUTE);// 將token存儲到返回結果userAuthExe.setToken(token);

就是生成并返回給前端的部分。我們再來看前端是如何保存的,我前端使用的Vue框架來寫的。

async loginAction() { // 輸入判空 if (this.loginAcStr === ’’ || this.loginPsStr === ’’) { return this.$message.error(’請輸入密碼’) } var qs = require(’qs’) const {data: res} = await axios.post(this.glAPI + ’/home/login’, qs.stringify({ username: this.loginAcStr, password: this.loginPsStr })) var dt = res.result if (dt.meta.status !== 1000) { if (dt.meta.status === 1001) { return this.$message.error(’賬號不存在’) } else { return this.$message.error(’賬號或密碼錯誤’) } } // 密碼正確 this.$toast(’登陸成功’) // 調用父組件方法獲取登錄信息 this.$emit(’loginGetUserIcon’) // 保存token window.sessionStorage.setItem(’token’, dt.token) // 隱藏 this.loginDrawerVisible = false // 調用父組件方法刷新購物車 this.$emit(’loginRefreshCart’) }

上述代碼里window.sessionStorage.setItem(’token’, dt.token)這句就是保存token,那么同理注銷也是針對sessionStoragewindow.sessionStorage.clear(),怎么樣是不是很簡單呀!

分析

為了讓尋找代碼的小伙伴看到最有用的內容,上面減少了很多廢話,直接上代碼上注釋就好,下面的分析可以理解為一段可能多余的話,在以往存儲session或者cookie的時候,可以理解為一個所有瀏覽器都通用的全局變量,而token就是去除這個全局變量的,將信息保存在了客戶端本地,減輕服務器壓力,網(wǎng)上各種討論哪個好哪個有優(yōu)勢哪個有缺點,說真的,我還沒有見到實際的業(yè)務需求,所有并沒有那么深刻的體會,也無法給出詳細的解答,就目前而言,我實現(xiàn)了無狀態(tài)的登錄,而且可以校驗時間是否過期,這就夠了!

總結

就是如何生成一串字符串,如何保存,然后如何從這段字符串里分析出時間,然后判定是否過期,然后判定是否有效,就是這樣一個過程,我相信你可能或許不是很理解這個流程,但是你可以先嘗試著使用Token,我一開始是覺得很神奇的,后來想想,其實就是我們參加某次聚會,別人給你發(fā)了個工作證明,你憑這個證明就能參加會議了,只不過放到網(wǎng)絡上面確實比較抽象。

到此這篇關于Java令牌Token登錄與退出的實現(xiàn)的文章就介紹到這了,更多相關Java Token登錄與退出內容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Java
相關文章:
主站蜘蛛池模板: 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 武汉宣传片制作-视频拍摄-企业宣传片公司-武汉红年影视 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 江西自考网-江西自学考试网| 辊道窑炉,辊道窑炉厂家-山东艾希尔| 打包钢带,铁皮打包带,烤蓝打包带-高密市金和金属制品厂 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 博莱特空压机|博莱特-阿特拉斯独资空压机品牌核心代理商 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 酒水灌装机-白酒灌装机-酒精果酒酱油醋灌装设备_青州惠联灌装机械 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 正压送风机-多叶送风口-板式排烟口-德州志诺通风设备 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 仓储笼_金属箱租赁_循环包装_铁网箱_蝴蝶笼租赁_酷龙仓储笼租赁 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 棕刚玉-白刚玉厂家价格_巩义市东翔净水材料厂 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 宿舍管理系统_智慧园区系统_房屋/房产管理系统_公寓管理系统 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 济南宣传册设计-画册设计_济南莫都品牌设计公司| 艾乐贝拉细胞研究中心 | 国家组织工程种子细胞库华南分库 | 黑田精工电磁阀-CAMMOZI气缸-ROSS电磁-上海茂硕机械设备有限公司 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 合肥花魁情感婚姻咨询中心_挽回爱情_修复婚姻_恋爱指南 |