jwt配置 restful_SpringBoot实现JWT保护前后端分离RESTful API
本文将用不到100行Java代码, 教你如何在Spring Boot里面用JWT保护RESTful api.
登录前
登录之后即可得到正确结果
登陆后
1. 什么是JWT
了解JWT的同学可以跳过这一部分
废话少说, 我们先看看什么是JWT. JSON Web Token其实就是一个包含认证数据的JSON, 大概长这样子
分三个部分,
第一部分{"alg":"HS512"}是签名算法
第二部分 {"exp":1495176357,"username":"admin"}是一些数据(你想放什么都可以), 这里有过期日期和用户名
第三部分')4'7�6-DM�(�H6fJ::$c���a4�~tI2%Xd-�$nL(l非常重要,是签名Signiture, 服务器会验证这个以防伪造. 因为JWT其实是明文传送, 任何人都能篡改里面的内容. 服务端通过验证签名, 从而确定这个JWT是自己生成的.
原理也不是很复杂, 我用一行代码就能表示出来
首先我们将JWT第一第二部分的内容, 加上你的秘钥(key或者叫secret), 然后用某个算法(比如hash算法)求一下, 求得的内容就是你的签名. 验证的时候只需要验证你用JWT算出来的值是否等于JWT里面的签名.
因为别人没有你的key, 所以也就没法伪造签名.
简单粗暴一行代码解释什么是签名:
intsigniture =("{alg:HS512}{exp:1495176357,username:admin}"+key).hashCode();
最后附上签名,得到完整的JWT:
{"alg":"HS512"}{"exp":1495176357,"username":"admin"}')4'7�6-DM�(�H6fJ::$c���a4�~tI2%Xd-�$nL(l
为了方便复制和使用, 通常我们都是把JWT用base64编码之后放在http的header里面, 并且每一次呼叫api都附上这个JWT, 并且服务器每次也验证JWT是否过期
通常我们用到的JWT:
Base64编码后:eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE0OTUxNzYzNTcsInVzZXJuYW1lIjoiYWRtaW4ifQ.mQtCfLKfI0J7c3HTYt7kRN4AcoixiUSDaZv2ZKOjq2JMZjBhf1DmE0Fn6PdEkyJZhYZJTMLaIPwyR-uu6BMKGw
2. 三个class实现JWT
整个demo一共有三个class
Application.java JwtAuthenticationFilter.java 和 JwtUtil.java
2.1首先我们看一看Application.java
第一步创建一个hello world api
@GetMapping("/protected")public@ResponseBodyObjecthellWorld(){return"Hello World! This is a protected api";}
第二步创建一个 login的api, 我们会验证用户的密码, 如果正确, 那么我们会返回生成jwt. 这时前端拿到的这个jwt就类似于拿到了一个临时的密码, 之后所有的HTTP RESTful api请求都附上这个"临时密码"即可.(专业术语叫令牌/token)
@PostMapping("/login")publicObjectlogin(HttpServletResponseresponse,@RequestBodyfinalAccountaccount)throwsIOException{if(isValidPassword(account)){Stringjwt =JwtUtil.generateToken(account.username);returnnewHashMap(){{put("token",jwt);}};}else{returnnewResponseEntity(HttpStatus.UNAUTHORIZED);}}
登录效果如下图
最后我们再注册一个检验jwt的过滤器Filter, 通过这个过滤器Filter实现对每个Rest api请求都验证jwt的功能. 这个JwtAuthenticationFilter继承了OncePerRequestFilter, 任何请求都会先经过我们的filter, 然后我们会选择让那些有合法jwt的请求通过我们的filter.
@BeanpublicFilterRegistrationBeanjwtFilter(){finalFilterRegistrationBeanregistrationBean =newFilterRegistrationBean();JwtAuthenticationFilterfilter =newJwtAuthenticationFilter();registrationBean.setFilter(filter);returnregistrationBean;}
2.2然后我们看一下JwtAuthenticationFilter.java
这里我们继承了OncePerRequestFilter, 保证了用户请求任何资源都会运行这个doFilterInternal. 这里我们会从HTTP Header里面截取JWT, 并且验证JWT的签名和过期时间, 如果有问题, 我们会返回HTTP 401错误.
PS: 这里有个情况就是用户登录/login前是没有jwt的, 所以我们要让登录的请求
publicclassJwtAuthenticationFilterextendsOncePerRequestFilter{//......一些不重要的代码......@OverrideprotectedvoiddoFilterInternal(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainfilterChain)throwsServletException,IOException{try{if(isProtectedUrl(request)){Stringtoken =request.getHeader("Authorization");//检查jwt令牌, 如果令牌不合法或者过期, 里面会直接抛出异常, 下面的catch部分会直接返回JwtUtil.validateToken(token);}}catch(Exceptione){response.sendError(HttpServletResponse.SC_UNAUTHORIZED,e.getMessage());return;}//如果jwt令牌通过了检测, 那么就把request传递给后面的RESTful apifilterChain.doFilter(request,response);}//......一些不重要的代码......}
2.3最后我们看一下JwtUtil.java
这里就两个函数, 第一个函数生成一个有效期1000小时的jwt
public static String generateToken(String username)
第二个函数是验证JWT是否有效, 如果JWT有效则返回用户名, 否则抛出Exception
public static void validateToken(String token)
这里的代码都非常简洁就十几行, 使用的都是现成的包, 建议直接看源代码.
3.测试
这就是呼叫api的效果
正确jwt
jwt配置 restful_SpringBoot实现JWT保护前后端分离RESTful API相关推荐
- 实现SpringMVC + Vue 前后端分离 支付宝API付款
项目场景: 需求:VUE + SpringMVC前后端分离项目使用支付宝API接口实现付款. 问题描述 提示为:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配 解决方案: 1.密钥真的不匹配 ...
- swagger -- 前后端分离的API接口
文章目录 一.背景 二.swagger介绍 三.在maven+springboot项目中使用swagger 四.swagger在项目中的好处 五.美化界面 参考链接: 5分钟学会swagger配置 参 ...
- php 完全前后端分离使用jwt,larke-admin 是一套使用 Laravel 8 、JWT 和 RBAC鉴权的前后端分离的通用后台管理系统...
StarLong (作者) 3周前 @deatil [stacktrace] #0 E:\PHPstudy\phpstudy_pro\WWW\laravel8\vendor\symfony\conso ...
- koa2后端和php后端,vue+koa2+mongo前后端分离restful,配置和部署到云
一.前端项目 1.使用vue-cli(vue2.0)搭建项目,这里就不发了. axios安装和配置 - npm install axios 1. main.js或app.js加载axios. impo ...
- 基于shiro+jwt的真正rest url权限管理,前后端分离
代码地址如下: http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+ ...
- springboot jwt token前后端分离_基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目...
一.前言 最近整合Spring Boot+Spring Security+JWT+Vue 完成了一套前后端分离的基础项目,这里把它开源出来分享给有需要的小伙伴们 功能很简单,单点登录,前后端动态权限配 ...
- 视频教程-springboot+Vue整合前后端分离权限后台管理系统-Java
springboot+Vue整合前后端分离权限后台管理系统 拥有八年的Java项目开发经验,擅长Java.vue.SpringBoot.springCloud.spring.springmvc.myb ...
- 【Docker】1、 前后端分离项目 下载启动运行
人人开源前后端分离项目下载与配置 文章目录 人人开源前后端分离项目下载与配置 前后端分离框架介绍 后端项目下载与配置 1.renren-fast后台项目介绍 2.开发环境搭建 3.下载后端renren ...
- 若依前后端分离版怎样去掉登录验证码
场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依前后端分离版本的配置 上面在 ...
最新文章
- AI 世界的硬核之战,Tengine 凭什么成为最受开发者欢迎的主流框架?
- 【转】nagios 命令解释
- java interface 函数_java8函数式接口(Functional Interface)
- java atomicinteger_Java多线程进阶(十三)—— J.U.C之atomic框架:AtomicInteger
- [-] Handler failed to bind to x.x.x.x:port排错
- 从海天信息化的三起三落领悟CIO的真谛
- mediawiki 搭建
- 20种小技巧,玩转Google Colab
- 今年-计划写一本java方面的书籍-初稿正式完成
- 5个APP自动化测试辅助定位工具,你用过几个?
- 浪尖聊聊大数据从业者的迷茫及解决方案
- 湖南大学操作系统导论课程作业
- 【Jmeter】分布式测试--单机均衡负载压测
- 国企央企OFFER收割全攻略 | 银行篇之差额体检答疑
- java客户端带证书访问服务端_客户端与服务器SSL双向认证(客户端:java-服务端:java)...
- tomcat配置前端静态文件gzip压缩
- 老师计算机组合照说说,有关于老师的说说句子
- android爬取视频播放地址,Android 视频中抓取图像 - MediaMetadataRetriever
- 卡西欧计算机的闹铃怎么取消,卡西欧如何关闭闹钟
- 微信小程序从入门到实践视频教程
热门文章
- 如何分析线程转储–线程堆栈跟踪
- Twitter4j和Esper:在Twitter上跟踪用户情绪
- python程序填空题参照代码模板、完善代码_python二级考试操作题11.pdf
- MySQL配置变量log-bin,重启数据库服务失败
- 如何通过命令终端访问本地/局域网/远程的MySQL数据库_访问数据库_连接数据库_登录数据库
- 简单的vue入门案例
- 输出节点位移_绝对值信号的编码器有哪些信号输出(一、二)
- python调用linux命令输出结果,Python-运行shell命令并捕获输出
- java package报错_Java基础知识总结 - 超详细篇(上)
- vue加跨域代理静态文件404_解决vue本地环境跨域请求正常,版本打包后跨域代理不起作用,请求不到数据的方法——针对vue2.0...