登录功能采用springsecurity安全框架和jwt令牌

首先需要添加依赖信息

在yml中添加JWT的配置文件

有了上述的配置之后,我们可以准备一个JWT的工具类,方便后面和JWT相关的内容去使用。

先新建一个config的包

创建2个静态变量,一个使用户名的KEY,另外一个是JWT创建的时间。

还有JWT的密钥和JWT的失效时间,这个我们可以使用@Vaule注解进行

@Component
public class JwtTokenUtil {
private static final String CLAIM_KEY_USERNAME = "sub";
private static final String CLAIM_KEY_CREATED = "created";
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration; }

然后我们还要在此类中做一些其他的功能。例如 根据用户名生成Token,也可以生成Token中拿出用户名,也可以判断当前的Token是否失效,是否可以刷新Token

首先第一个方法是生成token,方法名generateToken ,传入的用户信息,使用springsecurity中的UserDetails来获取用户信息。

/**
* 根据用户信息生成token
* @param userDetails
* @return
*/

public String generateToken(UserDetails userDetails){
}

在该方法中先准备一个荷载claims

Map<String ,Object> claims = new HashMap<>();

在claims中添加当前用户信息,以及添加当前的创建时间

claims.put(CLAIM_KEY_USERNAME,userDetails.getUsername());
claims.put(CLAIM_KEY_CREATED,new Date()); 

然后是返回值,返回一个generateToken的方法,该方法的参数值是荷载claims

return generateToken(claims); 

上面返回的这个generateToken方法。首先要使用Jwts中的builder方法,设置载荷(setClaims),再设置失效时间(setExpiration),还有签名(SignWith),compact().表示生成jwt。

    public String generateToken(Map<String,Object> claims){
return Jwts.builder()
.setClaims(claims) //先将荷载放入到Jwt中
.setExpiration(generateExpirationDate()) //将生效时间放入其中
.signWith(SignatureAlgorithm.ES512,secret)//使用ES512算法和密钥
.compact();
}

上面的generateToken中generateExoirationDate方法。使用当前的系统时间,加上我们在yml中配置的失效时间长度,即可。

private Date generateExpirationDate() {
return new Date(System.currentTimeMillis()+expiration*1000);
}

根据token解析出用户名

/**
* 从token中获取登录用户名
* @param token
* @return
*/
public String getUserNameFromToken(String token){ } 

在该方法中,使用getClaimsFormToken方法,参数为token 获取载荷claims。然后使用claims中的getSubject()方法,获取username。然后把代码try catch一下,把username的值置为空。返回username.具体代码如下:

    /**
* 从token中获取登录用户名
* @param token
* @return
*/
public String getUserNameFromToken(String token){
String username;
try {
Claims claims = getClaimsFormToken(token);
username = claims.getSubject();
} catch (Exception e) {
username = null;
}
return username;
} 

上面方法中的getClaimsFormToken方法:使用Jwts类获取载荷,并进行返回,如下所示。

private Claims getClaimsFormToken(String token) {
Claims claims = null;
try {
claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
e.printStackTrace();
}
return claims;
} 

判断当前token是否有效的方法。从2个方面进行判断,一方面首先判断当前token是否已经过期。另一方面,判断token荷载中的用户名和传入参数Userdetail中的用户名是否一致。
首先我们需要使用getUserNameFromToken方法获取username,然后 判断username和当前userDetails中的name是否一致,然后再使用isTokenExpired方法判断当前token是否已经过期。

    /**
* 验证当前的token值是否有效
* @param token
* @param userDetails
* @return
*/
public boolean validateToken(String token, UserDetails userDetails){
String username = getUserNameFromToken(token);
return username.equals(userDetails.getUsername()) && isTokenExpired(token); }

上面方法中的 isTokenExpired方法:首先获取当前token的失效的时间。然后判断该时间是否在当前时间之前,如果在当前时间之前,则已经失效。

    /**
* 判断当前的token是否已经超出失效时间
* @param token
* @return
*/
private boolean isTokenExpired(String token) {
Date expireDate = getExpiredDateFromToken(token);
return expireDate.before(new Date());
} 

上面方法中的 getExpiredDateFromToken方法是为了从token中获取失效时间,代码如下

    /**
* 从token中获取失效时间
* @param token
* @return
*/
private Date getExpiredDateFromToken(String token) {
Claims claims = getClaimsFormToken(token);
return claims.getExpiration(); }

再写一个方法,判断Token是否可以被刷新,也就是判断当前的token是否已经失效,若已经失效则可以被刷新,若未失效则无需刷新

    /**
* 判断token是否可以被刷新
* @param token
* @return
*/
public boolean canRefresh(String token){
return !isTokenExpired(token);
} 

再写一个刷新Token的方法,先获取荷载,然后把token的过期时间改一下,改成当前时间就可以了。然后再通过新的荷载生成token

    /**
* 刷新token
* @param token
* @return
*/
public String refreshToken(String token){
Claims claims = getClaimsFormToken(token);
claims.put(CLAIM_KEY_CREATED,new Date());
return generateToken(claims);
} 

至此,上述JwtTokenUtil类中的所有方法都已经完成,我们再来分析一下,

在该类中,只有一小部分的方法可以对外进行提供,其他都是一些内部的方法

例如从Token中获取登录名,  getUserNameFromToken()

  验证Token是否有效,  ValidateToken()

  判断Token是否可以被刷新,   canRefresh()

  刷新Token,  refreshToken()

 

后端004-JWT工具类的编写的更多相关文章

  1. java后端时间处理工具类,返回 "XXX 前" 的字符串

    转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...

  2. jwt工具类的封装

    第一步先引入jar: <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-j ...

  3. Java基础知识强化92:日期工具类的编写和测试案例

    1. DateUtil.java,代码如下: package cn.itcast_04; import java.text.ParseException; import java.text.Simpl ...

  4. 编写一个数组工具类, 编写本软件的 帮助文档(API文档)

    本文档是对静态成员的练习. 一. 建立一个ArrayTool(数组工具)的类,在此类中对传入数组进行一些操作(选最大值.先最小值.冒泡排正序.选择排反序.输出数组元素), 二. 建立一个Test的类, ...

  5. 记一次关于JDBCUtils工具类的编写

    jdbc.properties数据库配置的属性文件内容如下 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost/xxxx ...

  6. Bootstrap分页插件ajax返回数据,工具类的编写

    使用Bootstrap分页插件时,需要返回指定的参数,这样Bootstrap才能够识别 需要引入的css: <!-- boostrap table --> <link href=&q ...

  7. 02_c3p0之c3p0-config.xml配置案例,操作c3p0的jdbcUtil工具类的编写

     c3p0也是一个开源jdbc连接池,我们熟悉的Hibernate和Spring框架使用的都是该数据源. 这里获得数据源使用的方法是:ComboPooledDataSource 它提供的构造方法有 ...

  8. JWT工具类

    package com.ynhrm.common.utils; import io.jsonwebtoken.Claims;import io.jsonwebtoken.JwtBuilder;impo ...

  9. jwt 工具类

    public class TokenUtils { private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 签名 ...

  10. JAVA结合 JSON Web Token(JWT) 工具类

    引入java-jwt-3.3.0.jar .  jjwt-0.9.0.jar .jackson-all-1.7.6.jar 或者maven <!-- https://mvnrepository. ...

随机推荐

  1. Day 11 11.2 文件操作

    文件操作 引言 到目前为止,我们做的一切操作,都是在内存里进行的,这样会有什么问题吗?如果一旦断电或发生意外关机了,那么你辛勤的工作成果将瞬间消失.是不是感觉事还挺大的呢?现在你是否感觉你的编程技巧还 ...

  2. 通过nft持有大户地址获取正常交易和内部交易

    /*内部交易*/------------ CREATE TABLE `internal_txlist` ( `blockNumber` varchar(255) DEFAULT NULL, `tx_t ...

  3. C#连接数据库实现开发图书管理系统操作代码

    //客户端登录界面(Form1.cs窗口体系) using System; using System.Collections.Generic; using System.ComponentModel; ...

  4. 网络服务之DHCP与FTP

    目录 DHCP 一.DHCP是什么? 二.DHCP的优点 三.DHCP的分配过程 四.DHCP的工作原理 五.DHCP动态获取实验 FTP 一.FTP是什么? 二.FTP的数据连接模式 三.svftp ...

  5. Python面向对象编程——一些类定义(杂)

    一.abstractmethod 子类必须全部实现重写父类的abstractmethod方法 非abstractmethod方法可以不实现重写 带abstractmethod方法的类不能实例化 fro ...

  6. com.alibaba.fastjson.JSONObject cannot be cast to xxx

    今天在使用json格式的数据进行转化的时候遇到了这个问题,故此记录下来. 通常我们使用JSON把数据转成实体的方法是这样的 List<DataModel> dataModels= (Lis ...

  7. 3Com-OfficeConnect-Wireless-11宽带路由器默认口令

    网络空间资产搜索: app="3Com-OfficeConnect-Wireless-11g-Cable/DSL-Router" 找到环境 账户密码 admin/a***n End ...

  8. kubectl工具安装指南

    kubectl是一个用于连接Service Mesh控制平面的工具,可以安装在办公电脑的Windows系统上,也可以安装在虚拟机的Linux系统上,只要网络能与控制平面的公网地址互通即可.下面分别介绍 ...

  9. mysql datetime和timestamp区别

    datetime: 保存格式为YYYYMMDDHHMMSS的整数,与时区无关,存入什么值就是什么值,不会根据当前时区进行转换.mysql5.6.4中可以存储小数片段,最多小数点后6位,在mysql5. ...

  10. idea 部署项目到 docker 运行

    1.在远程服务器上开启 docker 远程连接 $vim /usr/lib/systemd/system/docker.service # ExecStart=/usr/bin/dockerd -H ...