Java令牌Token登录与退出的实现

Token

之前的博客已经介绍了各种登录的方式,现在直接介绍一种现在比较流行的登录方式,无状态登录,只需要客户端携带令牌就能登陆,服务器不再存储登录状态。突然粉丝量爆棚,开心死了,所以抓紧写一篇硬核代码,分享给大家,拿来即用的代码,直接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;

@Service
public 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);
 // 将账号与数据库内匹配
 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());
  }
 }
 // 存贮返回状态
 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就是去除这个全局变量的,将信息保存在了客户端本地,减轻服务器压力,网上各种讨论哪个好哪个有优势哪个有缺点,说真的,我还没有见到实际的业务需求,所有并没有那么深刻的体会,也无法给出详细的解答,就目前而言,我实现了无状态的登录,而且可以校验时间是否过期,这就够了!

总结

就是如何生成一串字符串,如何保存,然后如何从这段字符串里分析出时间,然后判定是否过期,然后判定是否有效,就是这样一个过程,我相信你可能或许不是很理解这个流程,但是你可以先尝试着使用Token,我一开始是觉得很神奇的,后来想想,其实就是我们参加某次聚会,别人给你发了个工作证明,你凭这个证明就能参加会议了,只不过放到网络上面确实比较抽象。

到此这篇关于Java令牌Token登录与退出的实现的文章就介绍到这了,更多相关Java Token登录与退出内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java获取微信accessToken的方法

    本文实例为大家分享了java如何获取微信accessToken,供大家参考,具体内容如下 package com.fengdi.lianmeng.task; import com.fengdi.lianmeng.common.CacheHelper; import com.fengdi.lianmeng.util.http.HttpRequest; import com.fengdi.lianmeng.util.tencent.CloudSignHelper; import com.fengdi

  • 基于Java验证jwt token代码实例

    这篇文章主要介绍了基于Java验证jwt token代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 How to load public certificate from pem file..?地址 1.HS256对称加密 package jwt; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyFactory; im

  • Java接口测试Cookie与token原理解析

    一.Cookie与token机制测试 Cookie与Session token机制 cookie/session机制需要在服务端保存大量的session信息,造成严重负担,而token机制则避免记录大量信息,采用服务器签发的token完成验证. 1.客户端使用用户名跟密码请求登录 2.服务端收到请求,去验证用户名与密码 3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端 4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local S

  • 微信支付java版本之获取Access_token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效. 公众平台的API调用所需的access_token的使用及生成方式说明: 1.为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器.而其他业务逻辑服务器所使用的ac

  • java http token请求代码实例

    本文实例为大家分享了java http token的具体代码,供大家参考,具体内容如下 package com.monitoring.common.util; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import ja

  • Java跨session实现token接口测试过程图解

    这套框架的报告是自己封装的 一般token会在登录接口返回结果中呈现,从代码层面获取token的方式有很多种,我是使用jsonpath这个json路径语言去匹配token所在路径的key值 没有使用testng.xml的情况下调试testCase,需要设置一下dependsOnMethods,否则token将无法传递给其他test步骤 附上TestUtil.getToken()方法: //获取返回的token ,使用JsonPath获取json路径 public static HashMap<S

  • Java实现基于token认证的方法示例

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们采用了另外一种认证方式:基于token的认证. 一.与cookie相比较的优势: 1.支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的: 2.无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而session需要在服务端存储,一般是通过cookie中的

  • 基于Java中的StringTokenizer类详解(推荐)

    StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是"空格"."制表符('\t')"."换行符('\n')"."回车符('\r')". StringTokenizer(String str,String delim)

  • Java中使用JWT生成Token进行接口鉴权实现方法

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过:解密失败说明Token无效或者已过期. 流程图如下: 一.用户发起登录请求 二.服务端创建一个加密后的JWT信息,作为Token返回 1.用户登录之后把生成的Token返回给前端 @Authorization @ResponseBody @GetMappin

  • Java令牌Token登录与退出的实现

    Token 之前的博客已经介绍了各种登录的方式,现在直接介绍一种现在比较流行的登录方式,无状态登录,只需要客户端携带令牌就能登陆,服务器不再存储登录状态.突然粉丝量爆棚,开心死了,所以抓紧写一篇硬核代码,分享给大家,拿来即用的代码,直接copy即可. 使用之前需要配置一下xml <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --> <dependency> <groupId>com.auth0<

  • SpringBoot集成Spring Security用JWT令牌实现登录和鉴权的方法

    最近在做项目的过程中 需要用JWT做登录和鉴权 查了很多资料 都不甚详细 有的是需要在application.yml里进行jwt的配置 但我在导包后并没有相应的配置项 因而并不适用 在踩过很多坑之后 稍微整理了一下 做个笔记 一.概念 1.什么是JWT Json Web Token (JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519) 该token被设计为紧凑且安全的 特别适用于分布式站点的单点登录(SSO)场景 随着JWT的出现 使得校验方式更加简单便

  • Java spring单点登录系统

    目录 1.单点登录系统介绍 2.简单业务实现 2.1添加依赖 2.2 项目配置文件 2.3添加项目启动类 2.4 启动并访问项目 3. 优化进一步设计 3.1 定义安全配置类 SecurityConfig 3.2定义用户信息处理对象 3.3 网关中登陆路由配置 3.4基于Postman进行访问测试 3.5 定义登陆页面 3.6 构建令牌配置对象 3.7 定义认证授权核心配置 授权服务器的核心配置 Postman访问测试 4 资源服务器配置–sca-resource 4.1 构建令牌配置对象 4.

  • token工作机制及原理附Java生成token工具类

    什么是token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码. 基于 Token 的身份验证使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.流程是这样的:客户端使用用户名跟密码请求登录服务端收到请求,去验证用户名与密码验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端客户端收到 T

  • SpringBoot实现token登录的示例代码

    为什么引入token机制? 在进行登录验证时,我们需要session或cookie会话进行验证,客户端包括浏览器.app.微信小程序.公众号,只有浏览器有session和cookie机制,当我们脱离浏览器用app等向服务端发请求就没有session和cookie机制,这时我们就需要使用token令牌进行登录验证. 代码实现 先建个util包,并创建TokenUtil类用于生成token TokenUtil类代码 package com.qcby.util; import com.qcby.ent

  • 入门到精通Java SSO单点登录原理详解

    目录 1. 基础概念 2. 单点登录 3. CAS 流程 4. OAuth 流程 5. CAS和OAuth的区别 1. 基础概念 SSO单点登录(Single sign-on) 所谓单点登录就是在多个应用系统中,用户只需登录一次就可以访问所有相互信任的系统. CAS 中央认证服务(Central Authentication Service) CAS是由美国耶鲁大学发起的一个企业级开源项目,旨在为WEB应用系统提供一种可靠的单点登录解决方案(WEB SSO). OAuth2.0 开放授权(Ope

  • Java Web实现登录页面验证码验证功能

    一.验证码 验证码本质上是一张图片,图片内容会随着程序的运行而随机生成 验证码的作用:防止应用恶意发送数据,一定程度上避免了恶意程序对网站的攻击. 验证码本质上是一张图片,图片内容的准确解析不容易用程序来实现. 验证码的绘制:绘制验证码图片不仅仅需要随机生成要绘制的内容,同时要配合Java中与绘图有关的一套API来完成. 二.效果演示 验证码Demo 三.给出完整代码 (1)服务器端代码ActionServlet.java package session; import java.io.IOEx

  • 手把手教你实现Java第三方应用登录

    目录 什么是OAuth2.0 申请网站接入 创建SpringBoot应用 实现登录流程 大家在自己做项目的时候有没有想过实现一个第三方应用登录呢?类似这种: 本篇文章就来聊一聊该如何实现第三方应用登录. 什么是OAuth2.0 OAuth是一项协议,它为用户资源的授权提供了一个安全.开放而简易的标准,OAuth的授权不会使第三方触及到用户的账号信息(比如密码),因此OAuth是相对安全的.而OAuth2.0就是OAuth的延续,不过2.0更加关注客户端开发者的简易性. 申请网站接入 常见的第三方

  • VUE实现token登录验证

    本文实例为大家分享了VUE实现token登录验证的具体代码,供大家参考,具体内容如下 实现这个登录功能的过程真是一波三折,中途出现了bug,整了两三天才解决了问题,心力交瘁,简直一个头两个大,感觉自己的毅力和耐心又提升了一个层次ORZ 好在最终在同学的帮助下解决了bug,不过我又再次感受到了作为一个菜鸟的浅薄,大佬的问题屡次触及到我的知识盲区......现在详细地记录一下实现token登录验证的步骤,以防以后再犯错 1.封装store对token的操作方法 首先在src目录下创建一个store文

  • Vue2.x配置路由导航守卫实现用户登录和退出

    目录 前言 一.配置路由导航守卫 1. 全局导航守卫 2. 局部导航守卫 二.用户登录 1. axios配置 2. 用户登录代码 三.用户退出 1. 实现代码 总结 前言 之前在Vue的学习中通过路由导航守卫控制实现了用户登录模块的功能,现在再次做项目时又要通过Vue配置路由导航守卫来实现相同的功能,在此将实现过程进行记录与总结(本文基于Vue2.x进行实现) 提示:以下是本篇文章正文内容,下面案例可供参考 一.配置路由导航守卫 1. 全局导航守卫 如果项目中只有后台的情况,在Vue中配置全局导

随机推荐