Java jjwt生成和解析Token

  • 参考
  • 依赖
  • 流程
  • 生成和解析Jwt
    • 生成jwt
    • 解析Jwt
  • 实例
    • 后端
    • 前端

刚学会了点使用Jwt来验证登录,记录下来

参考

JSON Web Tokens官网 Libraries里有各种语言的推荐包
jjwt的Github网址 JWT官网里面star最多的,所以用了
jjwt官方 生成和解析的例子
前后端分离之JWT用户认证 对JWT有详细的介绍
Java安全验证之JWT实践

依赖


当时在maven仓库里找到的最新版 网盘
Maven仓库 可以自己找最新的

流程

  1. 登录成功后,在Java中生成Jwt,存入数据库,然后返回给前端;前端接收到Jwt,储存起来(cookie或localStorage)。
  2. 前端调用api时放在Header的Authorization里面,后端通过过滤器Filter判断是否已登录。

没有使用框架,单纯的Html、servlet、数据库

生成和解析Jwt

其实就是官方的 然后用谷歌翻译了一波

生成jwt

//构建JWT的示例方法
private String createJWT(String id, String issuer, String subject, long ttlMillis) {//我们将用于签署令牌的JWT签名算法SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;//创建时间long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);//我们将使用我们的Api Key秘密签署您的JWTbyte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey.getSecret());Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());//让我们设置JWT Claims JwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject).setIssuer(issuer).signWith(signatureAlgorithm, signingKey);//builder.claim("name", "value"); //设置自定义的信息//如果已经指定,让我们添加到期日//过期时间if (ttlMillis >= 0) {long expMillis = nowMillis + ttlMillis;Date exp = new Date(expMillis);builder.setExpiration(exp);}//构建JWT并将其序列化为紧凑的URL安全字符串return builder.compact();
}

解析Jwt

//验证和读取JWT的示例方法
private void parseJWT(String jwt) {//如果它不是签名的JWS(如预期的那样),则该行将抛出异常Claims claims = Jwts.parser()         .setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret())).parseClaimsJws(jwt).getBody();System.out.println("ID: " + claims.getId());System.out.println("Subject: " + claims.getSubject());System.out.println("Issuer: " + claims.getIssuer());System.out.println("Expiration: " + claims.getExpiration());//claims.get("name") //获取自定义的信息
}

实例

后端

JwtUtil 工具类

package com.util;import java.security.Key;
import java.util.Date;import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;import com.alibaba.fastjson.JSONObject;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;public class JwtUtil {// token秘钥  太短会报错public static String SECRET = "qwerasdfdxzvdfajjlkjeiojznvxndjkfaowijeiodl";/*** 生成Jwt的方法* * @param id*            用户ID* @param subject*            用户昵称* @param ttlMillis*            过期时间* @return Token String 凭证*/public static String createJWT(String id, String subject, long ttlMillis) {// 签名方法 HS256SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;// 生成Jwt的时间long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);// 生成秘钥byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());// 设置JWT所存储的信息 JwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject).signWith(signingKey,signatureAlgorithm);//builder.claim("name", "value"); //存储自定义信息// 设置过期时间if (ttlMillis >= 0) {long expMillis = nowMillis + ttlMillis;Date exp = new Date(expMillis);builder.setExpiration(exp);}// 构建JWT并将其序列化为紧凑的URL安全字符串return builder.compact();}/*** 解析Jwt字符串* * @param jwt*            Jwt字符串* @return Claims 解析后的对象*/public static Claims parseJWT(String jwt) {return Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(SECRET)).parseClaimsJws(jwt).getBody();}/*** 验证JWT* * @param jwtStr jwt字符串* @return JOSNObject 解析结果<br/>*         &emsp;&emsp;Success 成功标识<br/>*         &emsp;&emsp;&emsp;&emsp;true:成功<br/>*         &emsp;&emsp;&emsp;&emsp;false:失败<br/>*         &emsp;&emsp;Claim 声明对象<br/>*         &emsp;&emsp;ErrCode 错误码<br/>*         &emsp;&emsp;&emsp;&emsp;1005:过期<br/>*         &emsp;&emsp;&emsp;&emsp;1004:未登录*/public static JSONObject validateJWT(String jwtStr) {JSONObject pojo = new JSONObject();Claims claims = null;try {claims = parseJWT(jwtStr);pojo.put("Success", true);pojo.put("Claims", claims);} catch (ExpiredJwtException e) {pojo.put("Success", false);pojo.put("ErrCode", 1005);e.printStackTrace();} catch (Exception e) {pojo.put("Success", false);pojo.put("ErrCode", 1004);e.printStackTrace();}return pojo;}
}

LoginServlet 登录

package com.test;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.util.JwtUtil;@WebServlet("/user/login")
public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();// 账号String Account = request.getParameter("Account");// 密码String password = request.getParameter("password");// 登录操作// 登录成功:// 有效时间:一天long ttlMillis = 24 * 60 * 60 * 1000;// 昵称String nickname = "star";// 生成jwsString jws = JwtUtil.createJWT(Account, nickname, ttlMillis);// jws存到数据库// 返回给前端out.print(jws);out.flush();out.close();}
}

JwtFilter 过滤器

package com.filter;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.entity.Result;
import com.util.JwtUtil;import io.jsonwebtoken.Claims;
// 登录、注册等操作不过滤  拦截servlet下的所有接口
@WebFilter(filterName = "JWTFilter", urlPatterns = { "/servlet/*" })
public class JWTFilter implements Filter {@Overridepublic void destroy() {/* 销毁时调用 */}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {/* 过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理 */HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();// jws设置在Header的Authorization里面String tokenStr = request.getHeader("Authorization");// 错误说明String msg = "系统异常";// 成功标识boolean flag = false;// 错误码int RtnValue = 9099;// 存放结果的实体类 有属性:success、errNum、messageResult lr = null;// 用户未登录if (tokenStr == null || tokenStr.equals("")) {RtnValue = 1004;msg = "未登录";lr = new Result(RtnValue, flag, msg);out.print(JSON.toJSONString(lr));out.flush();out.close();return;}// 解析jwsJSONObject pojo = JwtUtil.validateJWT(tokenStr);if (pojo.getBooleanValue("Success")) { // 解析成功Claims claims = (Claims) pojo.get("Claims");String Account = claims.getId();// 与数据库里的比较// truechain.doFilter(request, response);// false/** RtnValue = 1004;* msg = "登录失效";* lr = new Result(RtnValue, flag, msg);* out.print(JSON.toJSONString(lr));* out.flush();* out.close();*/} else { // 解析失败RtnValue = pojo.getIntValue("ErrCode");switch (RtnValue) {case 1005:msg = "签名过期";break;case 1004:msg = "未登录";break;default:break;}lr = new Result(RtnValue, flag, msg);out.print(JSON.toJSONString(lr));out.flush();out.close();}}@Overridepublic void init(FilterConfig config) throws ServletException {}
}

前端

登录成功后,把获取到的Token存起来

function login() {var account = $('#account').val();var password = $('password').val();$.ajax({url: 'user/login',data: {'account': account,'password': password},dataType: 'json',success: function (result) {if (result.success) {//登录成功 把Token令牌存起来window.localStorage.setItem('token', result.message);} else {alert(result.message);}}});
};

调用api

$(function () {$.ajax({headers: {// 不设置的话,返回信息会出现中文乱码contentType: 'application/x-www-form-urlencoded; charset=utf-8',// 传给后端判断是否登录Authorization: localStorage.getItem('token')},url: 'servlet/getUserinfo',data: {'id': '1'},dataType: 'json',success: function(result) {if (result.hasOwnProperty('success')) { // 调用接口被拦截了 登录出错alert(result.message);return;}// 相对应的操作}});
});

Java Token登录验证 使用jjwt生成和解析JWT相关推荐

  1. java token生成和验证_Java Token登录验证 生成解析Token

    借鉴参考 Java Token登录验证 使用jjwt生成和解析JWT java基于token验证之登陆验证 等 什么是Token? 我的理解来说 token就是你访问服务器的口令,只要token合法, ...

  2. token登录验证机制

    jwt: json web token 数据 前端 秘钥 前端 请求数据的时候. 需要通过秘钥生成命令令牌. Token token是oAuth Token,提供的是认证和授权,认证针对用户,授权是针 ...

  3. flask token 登录验证

    flask token 登录验证 视频 https://www.youtube.com/watch?v=J5bIPtEbS0Q 代码 #!/usr/bin/env python # -*- encod ...

  4. java SpringBoot登录验证token拦截器

    用户访问接口验证,如果用户没有登录,则不让他访问除登录外的任何接口. 实现思路: 1.前端登录,后端创建token(通过JWT这个依赖),返给前端 2.前端访问其他接口,传递token,后端判断tok ...

  5. java实现登录验证机制的技术_基于token的登陆验证机制

    session简介 做过Web开发的程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话信息. 用户通过用户名和密码登陆成功之后,服务器端程序会在 ...

  6. Java实现Token登录验证(基于JWT的token认证实现)

    文章目录 一.JWT是什么? 二.使用步骤 1.项目结构 2.相关依赖 3.数据库 4.相关代码 三.测试结果 一.JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流 ...

  7. SpringBoot集成JWT实现Token登录验证

    目录 1.1 JWT是什么? 1.2 JWT主要使用场景 1.3 JWT请求流程 1.4 JWT结构 二,SpringBoot集成JWT具体实现过程 2.1添加相关依赖 2.2自定义跳出拦截器的注解 ...

  8. Java用户登录验证系统流程

    前言 本文通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现. 结合网关相关知识食用更佳 业务图解 对于用户 ...

  9. Token登录验证(附图)

    什么是Token token是由服务器生成的一串加密后的字符串,用来作为客户端进行请求的一个标识. 用户第一次成功登录后,服务器会针对这个用户生成一个token,用来标识这个用用户,并将生成的toke ...

最新文章

  1. WPF Geometry 添加Path数据
  2. 最经典的权限设计同样也是最糟糕的权限设计,权限设计理念最关键第一步之间的PK...
  3. 【06年博文搬家】查看本机的瑞星序列号
  4. Premiere Pro 2020 安装教程
  5. 应用ITIL提升企业IT服务管理
  6. 解决EXSi6.0没有WEB Client的问题
  7. 输出100以内的质数
  8. win10系统 专业版 安装教程
  9. 帝国php获取栏目id,帝国CMS如何获取子栏目
  10. HDU-4622 Reincarnation (后缀自动机)
  11. 用七段数码管显示学号python_用七段数码管显示学号python
  12. C++中关于switch的一些理解
  13. python中#!含义
  14. 舆情监控和应急处理方案,如何做好网络舆情监控?
  15. 约瑟夫环问题(用数学方法推出计算公式)
  16. 图像处理-高斯滤波器与图像的关系
  17. ADV-369 第二点五个不高兴的小明 动态规划入门
  18. SNUNet-CD: A Densely Connected Siamese Network for Change Detection of VHR Images论文介绍
  19. 蓝桥杯青少年创意编程python初级考察内容_第十一届蓝桥杯青少年创意编程scratch初级组编程题详解...
  20. java高校学生综合素质测评系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. 关于IDEA使用Git进行版本控制的一些基本操作
  2. python怎么和SQL连接上
  3. 如何解决相机打开后显示灰色(只针对联想电脑)
  4. android 动画 空白页,Android WebView打开网页一片空白的解决方法
  5. 由国内的游戏软件的竞争,想到的
  6. python爬取视频界面简介
  7. 一款强大的芯片nRF52840及利用蓝牙5.0实现数据远程采集
  8. vue项目启动成功浏览器不显示
  9. 计算机基础知识字节,计算机基础知识:什么是位、字节、字、KB、MB
  10. JSONObject没有parseObject和fromObject方法的巨坑!!!