java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析
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及校验方法过程解析相关推荐
- json web token没有哪个成分_SpringBoot 2.1.4集成JWT实现token验证
SpringBoot 2.1.4集成JWT实现token验证
- SpringBoot集成JWT实现Token登录验证
目录 1.1 JWT是什么? 1.2 JWT主要使用场景 1.3 JWT请求流程 1.4 JWT结构 二,SpringBoot集成JWT具体实现过程 2.1添加相关依赖 2.2自定义跳出拦截器的注解 ...
- SpringBoot集成JWT实现token验证
Jwt全称是:json web token,以JSON对象的形式安全的传递信息.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过 ...
- java 接口参数验证_SpringBoot实现通用的接口参数校验
作者:cipher 来源:http://39sd.cn/560BA 本文介绍基于Spring Boot和JDK8编写一个AOP,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在 ...
- java发送s mime邮件_SpringBoot集成实现各种邮件发送
JavaMail是提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.正常我们会用JavaMail相关api来写发送邮件的相关代码. 使用过Spring的众多开发者都知 ...
- java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法
Spring-boot JMS 发送消息慢的问题解决 @Service public class Producer { @Autowired private JmsMessagingTemplate ...
- java微信获取用户信息_SpringBoot中获取微信用户信息的方法
前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要 ...
- java项目2个数据源_springboot项目配置两个数据源的方法
本篇文章给大家带来的内容是关于springboot项目配置两个数据源的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 本文主要介绍如何在一个springboot项目配置两个数据源 ...
- Java接受带文件的表单_Javaweb使用getPart接收表单文件过程解析
使用getPart接收表单文件时,注意Tomcat版本要在8之上. 前台 : form.jsp Title 请选择文件: 后台:TestServlet @WebServlet(name = " ...
最新文章
- 序列多重比对工具:MUSCLE
- python常用函数表-python-列表常用函数
- Ardino基础教程 22_PS2摇杆
- 当redis执行flush操作后的补救措施
- 《上海市数据中心建设导则(2021版)》
- 本科主要数学科目的页数统计
- IOS学习笔记十八(copy、mutableCopy、NSCopying、NSMutableCopy、深复制、浅复制)
- android 代理 wifi热点,android wifi热点默认网关
- 【工具】55种开源数据可视化工具简介
- selenium3 + python - expected_conditions判断元素
- 安徽破获以虚拟数字货币增值为幌子网络传销案,涉案逾2亿元
- 听了那么多语音识别,你知道它的发展史吗?
- 数学建模各种软件对比(MATLAB/Lingo/SAS/SPSS)
- 手机怎么用外嵌字幕_怎么用手机给视频添加字幕?原来方法这么简单,3分钟教你学会...
- php创建对象出问题,activex部件不能创建对象
- 容联云实现手机验证码
- 分布式系统学习共性总结:
- po是什么意思java_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
- 计算机动漫与游戏技术工资,计算机动漫与游戏制作专业是学什么的
- Android图片查看器
热门文章
- c++迭代器模式iterator
- C++ I/O语法及其用法
- java jpanel调用构造函数的时候就开始执行repaint_在Java Swing组件中劫持`repaint()`调用...
- java重新初始化吗_Java中为何已经重新赋值的变量在输出后会初始化?
- ack机制之代码实现,实现BaseRichBolt的方式,使用BaseBasicBolt的方式实现BaseRichBolt发ack和fail的功能
- spool命令、创建一个表,创建并且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站
- 斯坦福python中文分词stanza
- java用do while语句逆序输出_跟我学java编程—深入理解do-while循环语句的用法
- caffe中的batchNorm层(caffe 中为什么bn层要和scale层一起使用)
- 基于ZF网络的Faster RCNN网络结构详解(非常详细版)