json
数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。 {"alg":"HS256", "type":"JwT"}
{"id":"1","username":"Tom"}
Token
被篡改、确保安全性。将header
、payload
,并加入指定秘钥,通过指定签名算法计算而来。//原始的JWT令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
//1.HEADER:ALGORITHM & TOKEN TYPE (头)
{
"alg": "HS256",
"typ": "JWT"
}
//2.PAYLOAD:DATA (有效载荷)
{
"sub": "12345670",
"name": "John Doe",
"iat": 1516239022
}
//3.VERIFY SIGNATURE (数字签名)--通过前面的数据,执行签名算法
HMACSHA256(
baseUrlEncode(header) + "." +
baseUrlEncode(payload),
)
pom.xml
依赖:<!-- JWT令牌-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
/**
* 生成JWT令牌
*/
@Test
public void testGenJwt() {
//利用Map集合来整合需要存储的数据
Map<String, Object> claims = new HashMap<>();
claims.put("id", 1);
claims.put("name", "tom");
//链式编程
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "mannor")//签名算法 解析密钥
.setClaims(claims)//自定义内容(载荷)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为1h
.compact();
System.out.println(jwt);
//控制台输出:eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY4NzQ4OTkxOH0.FmNSF7KDVZ9SaGoVJb6jNDq_oqlgSeUcFBskGNgy0UE
}
/**
* 解析JwT
*/
@Test
public void testParseJwt() {
Claims claims = Jwts.parser()
.setSigningKey("mannor") //解析密钥
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY4NzQ5MTIwN30.Tjzr4CKzwJcGtYwiRCo7d71z6WNugMMefu09hUp5H3o")
.getBody();
System.out.println(claims);
}
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtils {
private static String signKey = "mannor"; //登录令牌
private static Long expire = 43200000L; //十二个小时后过期
/**
* 生成JWT令牌
* @param claims JWT第二部分负载 payload 中存储的内容
* @return
*/
public static String generateJwt(Map<String, Object> claims){
String jwt = Jwts.builder()
.addClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
return jwt;
}
/**
* 解析JWT令牌
* @param jwt JWT令牌
* @return JWT第二部分负载 payload 中存储的内容
*/
public static Claims parseJWT(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}
import com.mannor.Service.EmpService;
import com.mannor.pojo.Emp;
import com.mannor.pojo.Result;
import com.mannor.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp) {
log.info("登录的查询参数:{},{}", emp.getUsername(), emp.getPassword());
Emp e = empService.loginSelect(emp);
//登陆成功生成令牌,下发令牌
if (e != null) {
Map<String, Object> claim = new HashMap<>(); //存如我们需要的信息,ID,name、username
claim.put("id", e.getId());
claim.put("name", e.getName());
claim.put("username", e.getUsername());
String jwt = JwtUtils.generateJwt(claim);//jwt中包含了员工当前的登录信息
return Result.success(jwt);
}
//登录失败,返回错误信息
return Result.error("用户名或密码错误,请检查重新输入");
}
}
剩下的就需要来处理
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务