springboot整合token的實(shí)現(xiàn)代碼
寫在前面
- 在前后端交互過(guò)程中,為了保證信息安全,我們往往需要加點(diǎn)用戶驗(yàn)證。本文介紹了用springboot簡(jiǎn)單整合token。
- springboot版本2.2.0。另外主要用到了jjwt,redis。閱讀本文,你大概需要花費(fèi)7-10分鐘時(shí)間
整合token
1. 導(dǎo)入相關(guān)依賴
pom.xml文件中
<!-- jwt 加密解密工具類-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
2.TokenUtil.java實(shí)現(xiàn)生成/解析token
package com.dbc.usermanager.util;
import com.dbc.usermanager.service.RedisService;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;
public class TokenUtil {
/**
* 簽名秘鑰,可以換成 秘鑰 注入
*/
public static final String SECRET = "DaTiBao";//注意:本參數(shù)需要長(zhǎng)一點(diǎn),不然后面剪切的時(shí)候很可能長(zhǎng)度為0,就會(huì)報(bào)錯(cuò)
/**
* 簽發(fā)地
*/
public static final String issuer = "dtb.com";
/**
* 過(guò)期時(shí)間
*/
public static final long ttlMillis = 3600*1000*60;
/**
* 生成token
*
* @param id 一般傳入userName
* @return
*/
public static String createJwtToken(String id,String subject) {
return createJwtToken(id, issuer, subject, ttlMillis);
}
public static String createJwtToken(String id) {
return createJwtToken(id, issuer, "", ttlMillis);
}
/**
* 生成Token
*
* @param id 編號(hào)
* @param issuer 該JWT的簽發(fā)者,是否使用是可選的
* @param subject 該JWT所面向的用戶,是否使用是可選的;
* @param ttlMillis 簽發(fā)時(shí)間 (有效時(shí)間,過(guò)期會(huì)報(bào)錯(cuò))
* @return token String
*/
public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {
// 簽名算法 ,將對(duì)token進(jìn)行簽名
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 生成簽發(fā)時(shí)間
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
// 通過(guò)秘鑰簽名JWT
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
String str=signatureAlgorithm.getJcaName();
Key signingKey = new SecretKeySpec(apiKeySecretBytes, str);
// 讓我們?cè)O(shè)置JWT聲明
JwtBuilder builder = Jwts.builder().setId(id)
.setIssuedAt(now)
.setSubject(subject)
.setIssuer(issuer)
.signWith(signatureAlgorithm, signingKey);
// if it has been specified, let's add the expiration
if (ttlMillis >= 0) {
//過(guò)期時(shí)間
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
// 構(gòu)建JWT并將其序列化為一個(gè)緊湊的url安全字符串
return builder.compact();
}
/**
* Token解析方法
* @param jwt Token
* @return
*/
public static Claims parseJWT(String jwt) {
// 如果這行代碼不是簽名的JWS(如預(yù)期),那么它將拋出異常
Claims claims = Jwts.parser()
.setSigningKey(DatatypeConverter.parseBase64Binary(SECRET))
.parseClaimsJws(jwt).getBody();
return claims;
}
public static void main(String[] args) {
String token = TokenUtil.createJwtToken("2","ltz");
System.out.println(TokenUtil.createJwtToken("2","ltz"));
Claims claims = TokenUtil.parseJWT(token);
System.out.println(claims);
}
}
3.新增登錄驗(yàn)證的注解@LoginRequired
package com.dbc.usermanager.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//加入此注解,就需要token
@Target({ElementType.METHOD, ElementType.TYPE})// 表明此注解可用在方法名上
@Retention(RetentionPolicy.RUNTIME)// 運(yùn)行時(shí)有效
public @interface LoginRequired {
boolean required() default true;
}
4.測(cè)試
@PostMapping(value = "test")
@ApiOperation(value="生成token")
public ResultJson test(@RequestBody JSONObject requestJson){
String token= TokenUtil.createJwtToken("1","dtb");
redisService.set(token,"1");
return new ResultJson(0,"測(cè)試成功",null);
}
@GetMapping(value = "getToken")
@LoginRequired
@ApiOperation("")
public ResultJson getToken(String token){
if(redisService.exists(token)){
System.out.println(redisService.get(token));
}
return new ResultJson(0,"測(cè)試成功",null);
}
最后
- 實(shí)體類User.java等相關(guān)文件就不貼出來(lái)了,大家可以用自己寫好的實(shí)體類去編寫。
- 很多步驟與思想都在代碼中體現(xiàn),代碼中也加了很多注釋,你可以根據(jù)自己的需求進(jìn)行增刪查改。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java8日期類LocalDate、LocalTime和LocalDateTime使用方法詳解
這篇文章主要給大家介紹了關(guān)于Java8日期類LocalDate、LocalTime和LocalDateTime使用方法的相關(guān)資料,LocalDateTime是JDK1.8出現(xiàn)的新特性,解決線程不安全的問(wèn)題,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Java 多線程synchronized關(guān)鍵字詳解(六)
這篇文章主要介紹了Java 多線程synchronized關(guān)鍵字詳解(六)的相關(guān)資料,需要的朋友可以參考下2015-12-12
Spring中@ExceptionHandler注解的使用方式
這篇文章主要介紹了Spring中@ExceptionHandler注解的使用方式,@ExceptionHandler注解我們一般是用來(lái)自定義異常的,可以認(rèn)為它是一個(gè)異常攔截器(處理器),需要的朋友可以參考下2024-01-01
springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能
這篇文章主要介紹了springboot實(shí)現(xiàn)添加郵件發(fā)送及壓縮功能 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
tomcat報(bào)錯(cuò):Wrapper cannot find servlet class ...問(wèn)題解決
這篇文章主要介紹了tomcat報(bào)錯(cuò):Wrapper cannot find servlet class ...問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2016-11-11
簡(jiǎn)談java并發(fā)FutureTask的實(shí)現(xiàn)
這篇文章主要介紹了簡(jiǎn)談java并發(fā)FutureTask的實(shí)現(xiàn),FutureTask都是用于獲取線程執(zhí)行的返回結(jié)果。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
Springboot Autowried及Resouce使用對(duì)比解析
這篇文章主要介紹了Springboot Autowried及Resouce使用對(duì)比解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

