【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2

article/2025/10/10 13:52:21

一、 接口方式

    接口调用采用http协议,rest请求方式;

二、 接口安全

    接口安全采用Json web token (JWT)机制,基于token的鉴权机制.

1. 机制说明

    基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

2. 基本流程

    流程上是这样的:

        (1) 用户使用用户名密码来请求服务器

        (2) 服务器进行验证用户的信息

        (3) 服务器通过验证发送给用户一个token

        (4) 客户端存储token,并在每次请求时附送上这个token值(存在head里的参数X-AUTH-TOKEN

        (5) 服务端验证token值,并返回数据

 

 

3. 优点

  •   因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
  •   因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
  •   便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
  •   它不需要在服务端保存会话信息, 所以它易于应用的扩展

4. 安全相关

  •   不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
  •   保护好secret私钥,该私钥非常重要。
  •   如果可以,请使用https协议

三、 缓存配置

    JWT 验证token采用redis进行缓存,

    redis配置文件:src/main/resources/redis.properties

    修改redis对应的IP和端口。

#redis
redis.host=124.206.91.99
redis.port=6379
redis.pass=
redis.adapter.maxIdle=100
redis.adapter.minIdle=10
redis.adapter.testOnBorrow=true
redis.adapter.testOnReturn=true
redis.adapter.testWhileIdle=true
redis.adapter.numTestsPerEvictionRun=10
redis.adapter.timeBetweenEvictionRunsMillis=60000

四、 接口说明

    注意访问除【鉴权TOKEN接口】以外的接口时,都需要访问用户拥有对接口的访问权限,如无权限,将直接返回如下信息:

{"message":"您没有该接口的权限!","data":null,"ok":false,"respCode":"-1"}

1. 鉴权TOKEN接口

    ■描述

        根据用户名和密码获取TOKEN。

    ■访问地址

        http://域名/rest/tokens

    ■访问方式

        GET

    ■参数

参数名

数据类型

是否必须

示例值

默认值

描述

username

String

Y

“admin”

 

用户名

password

String

Y

123456

 

密码

 

    ■返回值

        成功时,直接返回token字符串。

        失败时直接返回用户账号密码错误!

    ■校验规则

        无

    ■请求示例

        请求地址http://域名/rest/tokens

{"username":"admin","password":"123456"
}

    ■返回示例

        成功案例:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4YThhYjBiMjQ2ZGM4MTEyMDE0NmRjODE4MTk1MDA1MiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU0NDE4fQ.tnILZEivS-6YOX9uqsnCHygh7-XrG_-Sj8vLslNGkdQ失败案例:用户账号密码错误!

2. 创建黑名单信息接口

    ■描述

        创建黑名单信息接口,黑名单为单表。

    ■访问地址

        http://域名/rest/tsBlackListController

    ■访问方式

        POST

    ■参数(详见excel)

参数名

数据类型

是否必须

示例值

默认值

描述

ip

String

Y

192.168.1.1

 

 

......

 

 

……省略信息其他字段……


    ■
返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(NULL)

ok

状态

    ■校验规则

        1. 接口中涉及日期时间的字段,要求格式化为字符串传递,日期格式为“YYYY-MM-dd”,时间格式为“YYYY-MM-dd HH:mm:ss”。

    ■请求示例

        请求地址http://域名/rest/tsBlackListController

    参数如下:

     注意:创建企业无需传id,子表无需传id和企业id,这些都会在后台生成,必需要传入的是来源id和来源表。

{"ip": "192.1.1.1",
……(省略信息其他字段)
}

    ■返回示例

成功案例:
{"respCode":"0"," respMsg":"成功"
}
失败案例:
{"respCode":"-1","respMsg":"黑名单创建失败"
}

3. 查询黑名单信息接口

    ■描述

        根据id查询或查询黑名单信息接口。

    ■访问地址

根据id查询

http://域名/rest/tsBlackListController/get/{id}

    ■访问方式

        GET

    ■参数

        无

    ■返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(结构参照创建企业接口的参数,具体字段参照excel)

ok

状态

    ■校验规则

    ■请求示例

        请求地址http://域名

/rest/tsBlackListController/get/297e7ae15f7f7f7e015f7fb0f57e0040

    ■返回示例

成功案例:{"message": "成功","data": {"id": "402881f15e751d2a015e75212c570005","createBy": "admin","updateBy": "","bpmStatus": "1","ip": "111.193.210.4","createName": "管理员","createDate": "2017-09-12 16:07:41","updateName": "","updateDate": null,"sysOrgCode": "A03","sysCompanyCode": "A03"},"respCode": "0","ok": true}
失败案例:
{"data":null,"respCode":"-1","respMsg":"根据所传id查询无结果"}

4. 修改黑名单信息接口

    ■描述

        根据id修改

    ■访问地址

        http://域名/rest/tsBlackListController/update/{id}

    ■访问方式

        PUT

    ■参数

参数名

数据类型

是否必须

示例值

默认值

描述

id

String

Y

402881f15f811877015f8124ca1c0002

 

 

ip

String

Y

192.168.1.1

 

 

 

 

 

……省略信息其他字段……

    ■返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(NULL

ok

状态

    ■校验规则

        通过校验主表的字段:来源id和来源表验证数据唯一性。

    ■请求示例

       请求地址http://域名/rest/tsBlackListController/update/402881f15f811877015f8124ca1c0002

       参数如下

{"id": "402881e75f94878e015f94896bb80002","ip": "1.1.1.1"}

    ■返回示例

成功案例:
{"respCode":"0","respMsg":"成功"
}失败案例:
{"respCode":"-1","respMsg":"输入ID无效,重复输入"
}

5. 删除黑名单接口

    ■描述

        根据id删除

    ■访问地址

        http://域名/rest/tsBlackListController/delete/{id}

    ■访问方式

        DELETE

    ■参数

       无

    ■返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(NULL)

ok

状态

    ■校验规则

        无

    ■请求示例

        请求地址http://域名/rest/tsBlackListController/delete/297e7ae15f7f7f7e015f7fb0f57e0040

    ■返回示例


成功案例:
{"respCode":"0","respMsg":"成功"
}
失败案例:
{"respCode":"-1","respMsg":"输入ID无效,重复输入"
}

五、 客户端测试代码

    代码示例

public static String getToken(String userName,String password){String url = "http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;String token= JwtHttpUtil.httpRequest(url, "POST", null);return token;}//获取黑名单列表public static JSONObject getBlackList(String token){String url = "http://localhost:8080/jeecg/rest/tsBlackListController";JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);return resp;}//创建黑名单public static JSONObject createBlackList(String token,String json){String url = "http://localhost:8080/jeecg/rest/tsBlackListController";JSONObject resp= JwtHttpUtil.httpRequest(url, "POST", json,token);return resp;}//更新黑名单public static JSONObject updateBlackList(String token,String json){String url = "http://localhost:8080/jeecg/rest/tsBlackListController";JSONObject resp= JwtHttpUtil.httpRequest(url, "PUT", json,token);return resp;}//删除黑名单public static JSONObject deleteBlackList(String token,String id){String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;JSONObject resp= JwtHttpUtil.httpRequest(url, "DELETE", null,token);return resp;}//查询黑名单public static JSONObject getBlackList(String token,String id){String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);return resp;}


  • 参考源码:
package org.jeecgframework.test.demo;import org.jeecgframework.jwt.util.JwtHttpUtil;import com.alibaba.fastjson.JSONObject;/*** jeecg jwt* 接口客户端调用demo* @author qinfeng**/
public class JwtRestfulClientDemo {public static String getToken(String userName,String password){String url = "http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;String token= JwtHttpUtil.httpRequest(url, "POST", null);return token;}//获取黑名单列表public static JSONObject getBlackList(String token){String url = "http://localhost:8080/jeecg/rest/tsBlackListController";JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);return resp;}//创建黑名单public static JSONObject createBlackList(String token,String json){String url = "http://localhost:8080/jeecg/rest/tsBlackListController";JSONObject resp= JwtHttpUtil.httpRequest(url, "POST", json,token);return resp;}//更新黑名单public static JSONObject updateBlackList(String token,String json){String url = "http://localhost:8080/jeecg/rest/tsBlackListController";JSONObject resp= JwtHttpUtil.httpRequest(url, "PUT", json,token);return resp;}//删除黑名单public static JSONObject deleteBlackList(String token,String id){String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;JSONObject resp= JwtHttpUtil.httpRequest(url, "DELETE", null,token);return resp;}//查询黑名单public static JSONObject getBlackList(String token,String id){String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);return resp;}public static void main(String[] args) {String token = getToken("interfaceuser","123456");
//		String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJhZG1pbiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU5NjM2fQ.Emfe8VZKA_L33jaW8ZUtVFVDEin83Np_d3gKlPIZryE";
//		System.out.println(token);//添加黑名单
//		JSONObject jsonObject=new JSONObject();
//		jsonObject.put("ip","192.168.1.2");
//		System.out.println("======添加黑名单======="+createBlackList(token,jsonObject.toJSONString()));//更新黑名单
//		JSONObject jsonObject=new JSONObject();
//		jsonObject.put("id","402881ee6001da57016001dc13110001");
//		jsonObject.put("ip","192.168.0.111");
//		System.out.println("======更新黑名单======="+updateBlackList(token,jsonObject.toJSONString()));//删除黑名单
//		System.out.println("======删除黑名单======="+deleteBlackList(token,"402881ee6001da57016001dc13110001"));//查询黑名单
//		System.out.println("======查询黑名单======="+getBlackList(token,"402881ee6001e873016001f369f40008"));//获取黑名单列表System.out.println("======获取黑名单列表======="+getBlackList(token));}}
package org.jeecgframework.jwt.util;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import org.jeecgframework.core.util.LogUtil;
import com.alibaba.fastjson.JSONObject;/*** JWT 客户端* @author qinfeng**/
public class JwtHttpUtil {/*** 发起https请求并获取结果* * @param requestUrl*            请求地址* @param requestMethod*            请求方式(GET、POST)* @param outputStr*            提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr, String sign) {JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();HttpURLConnection httpUrlConn = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化URL url = new URL(requestUrl);httpUrlConn = (HttpURLConnection) url.openConnection();httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);httpUrlConn.setRequestProperty("X-AUTH-TOKEN", sign);httpUrlConn.setRequestProperty("Accept", "*/*");httpUrlConn.setRequestProperty("Content-Type", "application/json");// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod))httpUrlConn.connect();// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();System.out.println(buffer.toString());jsonObject = JSONObject.parseObject(buffer.toString());// jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {LogUtil.info("Weixin server connection timed out.");} catch (Exception e) {e.printStackTrace();org.jeecgframework.core.util.LogUtil.info("https request error:{}" + e.getMessage());} finally {try {httpUrlConn.disconnect();} catch (Exception e) {e.printStackTrace();org.jeecgframework.core.util.LogUtil.info("http close error:{}" + e.getMessage());}}return jsonObject;}/*** 发起https请求并获取结果* * @param requestUrl*            请求地址* @param requestMethod*            请求方式(GET、POST)* @param outputStr*            提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {String res = "";StringBuffer buffer = new StringBuffer();HttpURLConnection httpUrlConn = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化URL url = new URL(requestUrl);httpUrlConn = (HttpURLConnection) url.openConnection();httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);httpUrlConn.setRequestProperty("Accept", "text/plain");httpUrlConn.setRequestProperty("Content-Type", "application/json");// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod))httpUrlConn.connect();// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();res = buffer.toString();System.out.println(res);
//			jsonObject = JSONObject.parseObject(buffer.toString());// jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {LogUtil.info("Weixin server connection timed out.");} catch (Exception e) {e.printStackTrace();org.jeecgframework.core.util.LogUtil.info("https request error:{}" + e.getMessage());} finally {try {httpUrlConn.disconnect();} catch (Exception e) {e.printStackTrace();org.jeecgframework.core.util.LogUtil.info("http close error:{}" + e.getMessage());}}return res;}}



  • 附录1:接口返回CODE

code

msg

说明

解决方案

0

SUCCESS

成功

 

-1

ERROR

无接口访问权限

 

1000

VALID_ERROR

验证失败

 

r0001

SAVE_SUCCESS

写入成功

 

r0002

UPDATE_SUCCESS

更新成功

 

r0003

REMOVE_SUCCESS

删除成功

 

 


http://chatgpt.dhexx.cn/article/BaOlMjdR.shtml

相关文章

轻量级前端MVVM框架avalon - 整体架构

官网提供架构图 单看这个图呢,还木有说明,感觉有点蛋疼,作者的抽象度太高了,还好在前面已经大概分析过了执行流程 如图 左边是View视图,我们就理解html结构,换句话就是说用户能看到的界面,渲染页面,绑定事件,切换类名,什么脏活都揽右边是View…

下载kaggle数据集出现的一系列问题

下载kaggle数据集出现了如下情况 按照下面的帖子安装kaggle库 https://www.cnblogs.com/shuaishuaidefeizhu/p/15170305.html 1.windowsR 打开命令提示符cmd,输入pip install kaggle --user 2.在C:\Users\(用户名)文件下会生成一个.kaggle文…

CT图像重建算法------射线驱动投影模型

在模拟CT扫描过程中被测物体保持静止不动,射线源与探测器绕Z轴做逆时针旋转,每隔一定角度进行一次投影数据的计算,而计算方法则取决于采用什么样的投影算法。本文主要介绍了投影算法的分类,并详细描述了射线驱动算法中的joseph算法…

尤雨溪告诉你为什么Vue比yox优秀

2019年6月8日来自全球各地的开发者齐聚上海交通大学文治堂,VueConf 2019 在上海成功举办。 VUE 3.0 最新进展 更快 使用 Object.defineProperty -> Proxy 速度 提升了1倍 VUE3.0 将 Virtual DOM 重构 速度 提升 6 倍 牛逼吧 !!&…

kubernetes的初认识

1.先谈容器。 一个“容器”,实践上是一个由Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。 一个正在运行的linux容器,其实可以被“一分为二”地看待: 一组联合挂载在/var/lib/docker/overlay2下的rootfs&a…

KubeSphere简介,功能介绍,优势,架构说明及应用场景

目录 一、KuberSphere简介 1.1 功能介绍 1.2 Kubernetes 资源管理 1.3 微服务治理 1.4 多租户管理 1.5 DevOps 工程 1.6 Source to Image 1.7 多维度监控 1.8 自研多租户告警系统 1.9 日志查询与收集 1.10 应用管理与编排 1.11 基础设施管理 1.12 多存储类型支持…

云原生钻石课程 | 第4课:Kubernetes存储架构原理深度剖析(上)

点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 本篇文章来自《华为云云原生王者之路训练营》钻石系列课程第4课,由云原生存储解决方案Everest2.0的架构设计专家Jabin主讲,详细介绍云原生存储…

1.k8s基本使用(测试加分)

测试为什么要学习容器技术及k8s k8s不是运维的专属技术 随着互联网技术的发展,架构也已经从单体架构发展到容器云( “微服务 k8s” 完美结合) 很多人认为,k8s只是运维需要掌握的技术,讲真,测试和运维、开发都有技术交集 所以&…

Kubernetes 持久化存储(Pod Volumes,PV和PVC)

一、Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 kubelet 重新拉起之后,如何保证之前容器产生的重要数据没有丢失?场景二:如果…

面试题引出的知识点整理

1、自旋锁&可重复锁&公平锁&共享锁&分段锁你都知道吗? 2、无锁&偏向锁&轻量级锁&重量级锁如何膨胀升级? 3、Lock底层AQS实现与Synchronized底层实现异同? 4、LongAdder的分段CAS优化机制如何设计的? 5、Java多线程内存模型…

云集成,给超大规模K8s运维带来的丝滑体验

根据IDC统计,未来五年容器基础架构软件市场将以超过40%的复合增长率爆发式增长,行业也从互联网向更多的传统行业渗透,比如金融、政府、电信,制造和能源等行业。 近年来,随着云技术的日益普及,越来越多的企…

Spring

目录 1.spring介绍 spring中的两个核心概念 1.1 IoC 1.2 AoP 1.3 Spring的优点 1.4 Spring工程构建 1.4.1 Maven Spring 依赖 1.4.2 Spring核心配置文件编写 1.4.2.1 完成控制反转以及依赖注入 1.4.2.2 测试 1.4.2.3 Spring中的IOC 产生的对象是否是单例模式 1.5 B…

动静分离 与 热点缓存

动静分离 让系统“快”起来:1、提高单次请求的效率2、减少没必要的请求 “动静分离”就是瞄着这个大方向去的。所谓“动静分离”,其实就是把用户请求的数据(如HTML页面)划分为“动态数据”和“静态数据”。简单来说,“…

天猫浏览型应用的CDN静态化架构演变

转载自:http://zhu-zhiguo.iteye.com/blog/2145496 在天猫双11活动中,商品详情、店铺等浏览型系统,通常会承受超出日常数倍甚至数十倍的流量冲击。随着历年来双11流量的大幅增加, 每年这些浏览型系统都要面临容量评估、硬件扩容、…

java 确保线程安全_确保不安全感

java 确保线程安全 33岁的克雷格斯宾塞(Craig Spencer)在治疗埃博拉病毒患者后于10月17日从非洲返回美国。 几天后,他的埃博拉病毒呈阳性React。 每个人(尤其是周围的人)和纽约人都感到关切。 纽约市市长走到媒体前&am…

经验:一个秒杀系统的设计思考

前言 秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。 从架构视角来看,秒杀系统本质是一个高性能、高一…

Java调用C++/C

Java调用C/C有3中方式:JNI、JNA、JNative。 注:1、个人觉得还是JNA的方式最好。 2、Java和C/C交互的难点在于数据结构的对应 3、java不可以直接调用C#代码,C#代码需要托管 JNI (Android调用,普通java类似)…

kubernetes 静态存储与动态存储

静态存储 Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来,并且对其进一步细化。Kubernetes 将 Volume 分为持久化的 PersistentVolume 和非持久化的普通 Volume 两类。为了不与前面定义的 Volume 这个概念产生混淆,后面特指 Kubernetes …

Java多线程整理

目录 1. 进程与线程 1.1 进程 1.2 线程 1.3 并发与并行 2. 多线程 2.1 多线程的概念 2.2 多线程的好处 2.3 主线程 3. 线程的创建与启动 3.1 继承Thread类 3.2 实现Runnable接口 3.3 实现Callable接口 3.4 run方法调用和start调用的区别 4.线程的状态 4.1 线程状…

th和td标签的区别

th和td标签的区别 开发工具与关键技术: Dw HTML 作者:邹贺汗 撰写时间:2019年2月4日 在写这篇文章的时候我就知道虽然我发的不是第一个,但是说不定我写刚好给有需要的人看到了呢,所以我就写了这篇文章,下面…