GitHub源码地址:https://github.com/zeng-xian-guo/springboot_jwt_token.git

封装JTW生成token和校验方法

public class JwtTokenUtil {

//公用密钥-保存在服务端,客户端是不会知道密钥的,以防被攻击

public static String SECRET = "ThisIsASecret";

//生成Troke

public static String createToken(String username) {

//签发时间

//Date iatDate = new Date();

//过地时间 1分钟后过期

//Calendar nowTime = Calendar.getInstance();

//nowTime.add(Calendar.MINUTE, 1);

//Date expiresDate = nowTime.getTime();

Map map = new HashMap();

map.put("alg", "HS256");

map.put("typ", "JWT");

String token = JWT.create()

.withHeader(map)

//.withClaim( "name","Free码生") //设置 载荷 Payload

//.withClaim("age","12")

//.withClaim( "org","测试")

//.withExpiresAt(expiresDate)//设置过期时间,过期时间要大于签发时间

//.withIssuedAt(iatDate)//设置签发时间

.withAudience(username) //设置 载荷 签名的观众

.sign(Algorithm.HMAC256(SECRET));//加密

System.out.println("后台生成token:" + token);

return token;

}

//校验TOKEN

public static boolean verifyToken(String token) throws UnsupportedEncodingException{

JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

try {

verifier.verify(token);

return true;

} catch (Exception e){

return false;

}

}

//获取Token信息

public static DecodedJWT getTokenInfo(String token) throws UnsupportedEncodingException{

JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

try{

return verifier.verify(token);

} catch(Exception e){

throw new RuntimeException(e);

}

}

}

新建自定义注解:@UserLoginToken

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface UserLoginToken {

boolean required() default true;

}

关于拦截器配置:

@Configuration

public class InterceptorConfig implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(authenticationInterceptor())

.addPathPatterns("/**"); // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录

}

@Bean

public AuthenticationInterceptor authenticationInterceptor() {

return new AuthenticationInterceptor();

}

}

public class AuthenticationInterceptor implements HandlerInterceptor {

@Autowired

UserService userService;

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {

String token = httpServletRequest.getHeader("token");// 从 http 请求头中取出 token

// 如果不是映射到方法直接通过

if(!(object instanceof HandlerMethod)){

return true;

}

HandlerMethod handlerMethod=(HandlerMethod)object;

Method method=handlerMethod.getMethod();

//检查是否有passtoken注释,有则跳过认证

if (method.isAnnotationPresent(PassToken.class)) {

PassToken passToken = method.getAnnotation(PassToken.class);

if (passToken.required()) {

return true;

}

}

//检查有没有需要用户权限的注解

if (method.isAnnotationPresent(UserLoginToken.class)) {

UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);

if (userLoginToken.required()) {

// 执行认证

if (token == null) {

throw new RuntimeException("无token,请重新登录");

}

// 验证 token

if(JwtTokenUtil.verifyToken(token)){

return true;

}else {

throw new RuntimeException("401");

}

}

}

return true;

}

@Override

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}

}

登录:

在Controller上登录方法不用添加@UserLoginToken自定义注解,其余获取后台数据方法加上@UserLoginToken自定义注解,目的验证token是否有效,是则返回数据,否则提示401无权限。

测试:

@Controller

@RequestMapping(path = "/api")

public class IndexController {

private String prefix = "index/";

@GetMapping("/index")

public String index()

{

return prefix + "index";

}

@UserLoginToken

@PostMapping("/test")

@ResponseBody

public Object test(){

Map map = new HashMap<>();

map.put("code","200");

map.put("message","你已通过验证了");

return map;

}

}

HTTP请求带上登陆成功后生成token,返回成功:

HTTP请求带上无效token或不带token,返回失败:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析相关推荐

  1. json web token没有哪个成分_SpringBoot 2.1.4集成JWT实现token验证

    SpringBoot 2.1.4集成JWT实现token验证

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

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

  3. SpringBoot集成JWT实现token验证

    Jwt全称是:json web token,以JSON对象的形式安全的传递信息.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过 ...

  4. java 接口参数验证_SpringBoot实现通用的接口参数校验

    作者:cipher 来源:http://39sd.cn/560BA 本文介绍基于Spring Boot和JDK8编写一个AOP,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在 ...

  5. java发送s mime邮件_SpringBoot集成实现各种邮件发送

    JavaMail是提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.正常我们会用JavaMail相关api来写发送邮件的相关代码. 使用过Spring的众多开发者都知 ...

  6. java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法

    Spring-boot JMS 发送消息慢的问题解决 @Service public class Producer { @Autowired private JmsMessagingTemplate ...

  7. java微信获取用户信息_SpringBoot中获取微信用户信息的方法

    前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要 ...

  8. java项目2个数据源_springboot项目配置两个数据源的方法

    本篇文章给大家带来的内容是关于springboot项目配置两个数据源的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 本文主要介绍如何在一个springboot项目配置两个数据源 ...

  9. Java接受带文件的表单_Javaweb使用getPart接收表单文件过程解析

    使用getPart接收表单文件时,注意Tomcat版本要在8之上. 前台 : form.jsp Title 请选择文件: 后台:TestServlet @WebServlet(name = " ...

最新文章

  1. 序列多重比对工具:MUSCLE
  2. python常用函数表-python-列表常用函数
  3. Ardino基础教程 22_PS2摇杆
  4. 当redis执行flush操作后的补救措施
  5. 《上海市数据中心建设导则(2021版)》
  6. 本科主要数学科目的页数统计
  7. IOS学习笔记十八(copy、mutableCopy、NSCopying、NSMutableCopy、深复制、浅复制)
  8. android 代理 wifi热点,android wifi热点默认网关
  9. 【工具】55种开源数据可视化工具简介
  10. selenium3 + python - expected_conditions判断元素
  11. 安徽破获以虚拟数字货币增值为幌子网络传销案,涉案逾2亿元
  12. 听了那么多语音识别,你知道它的发展史吗?
  13. 数学建模各种软件对比(MATLAB/Lingo/SAS/SPSS)
  14. 手机怎么用外嵌字幕_怎么用手机给视频添加字幕?原来方法这么简单,3分钟教你学会...
  15. php创建对象出问题,activex部件不能创建对象
  16. 容联云实现手机验证码
  17. 分布式系统学习共性总结:
  18. po是什么意思java_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
  19. 计算机动漫与游戏技术工资,计算机动漫与游戏制作专业是学什么的
  20. Android图片查看器

热门文章

  1. c++迭代器模式iterator
  2. C++ I/O语法及其用法
  3. java jpanel调用构造函数的时候就开始执行repaint_在Java Swing组件中劫持`repaint()`调用...
  4. java重新初始化吗_Java中为何已经重新赋值的变量在输出后会初始化?
  5. ack机制之代码实现,实现BaseRichBolt的方式,使用BaseBasicBolt的方式实现BaseRichBolt发ack和fail的功能
  6. spool命令、创建一个表,创建并且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站
  7. 斯坦福python中文分词stanza
  8. java用do while语句逆序输出_跟我学java编程—深入理解do-while循环语句的用法
  9. caffe中的batchNorm层(caffe 中为什么bn层要和scale层一起使用)
  10. 基于ZF网络的Faster RCNN网络结构详解(非常详细版)