JWT的介绍

Json Web Token(JWT)是目前比较流行的跨域认证解决方案,是一种基于JSON的开发标准,由于数据是可以经过签名加密的,比较安全可靠,一般用于前端和服务器之间传递信息,也可以用在移动端和后台传递认证信息。

具体实现:

1、首先是在pom.xml中导入依赖

 <dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>

2、一般用法会写成一个工具类,这里叫JWTUtil,主要包含了生成签名、验证、获取token这几个基本方法,这些说一下加密算法和头部信息:

头信息Header:描述JWT基本信息,typ表示采用JWT令牌,alg(algorithm)表示采用什么算法进行签名,常见算法有HmacSHA256(HS256)、HmacSHA384(HS384)、HmacSHA512(HS512)、SHA256withECDSA(ES256)、SHA256withRSA(RS256)、SHA512withRSA(RS512)等。如果采用HS256则头信息结构为:

  

具体代码实现如下:

package com.study.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT; import java.util.HashMap;
import java.util.Map;
import java.util.Date; public class JwtUtils {
//设置token过期时间-15分钟
private static final long EXPIRE_TIME = 15 * 60 * 1000;
//设置token私钥
private static final String SECRET_KEY = "ilovezhongguo123"; /*
* 生成签名
*
   */
public static String sign(String username, String password) {
try {
// 设置过期时间
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
// 私钥和加密算法
Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
// 设置头部信息
Map<String, Object> header = new HashMap<>(2);
header.put("Type", "Jwt");
header.put("alg", "HS256");
// 返回token字符串
return JWT.create()
.withHeader(header)
.withClaim("username", username)
.withClaim("pwd", password)
.withExpiresAt(date)
.sign(algorithm);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 检验token是否正确
* @param **token**
* @return
*/
public static boolean verify(String token,String username,String password){
try {
Algorithm algorithm = Algorithm.HMAC256(password+SECRET_KEY);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username",username)
.build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e){
return false;
}
}
/**
* 从token中获取username信息,无需解密
* @param **token**
* @return
*/
public static String getUserName(String token){
try {
DecodedJWT jwt = JWT.decode(token);
if(System.currentTimeMillis()-jwt.getExpiresAt().getTime()>0){
return null;
}
return jwt.getClaim("loginName").asString();
} catch (JWTDecodeException e){
e.printStackTrace();
return null;
}
}
}

3、controller层的测试使用,写的过于简单了,其主要是作用于签名

@RequestMapping("login")
public Map<String, Object> login(@RequestBody User user) {
Map<String, Object> map = new HashMap<>();
User user1 = userService.queryUser(user);
if (user1 != null) {
String token = JwtUtils.sign(user1.getUsername(), user1.getPassword());
if (token != null) {
map.put("status", "success");
map.put("token", token);
map.put("message", "签名成功");
}
}
map.put("status", "error");
map.put("message", "签名失败");
return map;
}

最新文章

  1. JavaScript系列文章:自动类型转换-续
  2. C语言运算符优先级和口诀(转)
  3. php+jquery注册实例
  4. HDOJ ----Phone List
  5. DOJO 如何清空表单
  6. struts2框架的第一个程序
  7. 分享一个dapper简单封装
  8. 【转】ASP.NET MVC教程
  9. eclipse中删除多余的工作空间记录
  10. 开源 自由 java CMS - FreeCMS2.0 举APP产生信息数据
  11. linux的学习系列 9--网络通信
  12. LeetCode 229. Majority Element II (众数之二)
  13. ORA-15137: cluster in rolling patch
  14. DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)
  15. MySQL中exists和in的区别及使用场景
  16. hdu 1.3.4 shǎ崽 OrOrOrOrz
  17. jq expando &amp;&amp; $.data()
  18. Content-Disposition 响应头,设置文件在浏览器打开还是下载
  19. win7、8上走网络打印机(需找驱动包,不能自动)
  20. webpack局部安装的问题

热门文章

  1. [LC] 434. Number of Segments in a String
  2. 使用这些高效Java工具类享受开发乐趣
  3. python语法基础-基础-变量和数据类型
  4. CAD安装错误1625:系统策略禁止这个安装,请与系统管理员联系。
  5. 使用dtree构建框架导航
  6. [LC] 232. Implement Queue using Stacks
  7. idea常见需求
  8. 用nexus搭建maven2内部服务器
  9. Luogu_1080_国王游戏
  10. coreseek 在gcc 4.9+ 上编译不通过 [sphinxexpr.o] Error 1 错误解决方案