【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2
一、 接口方式
接口调用采用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 |
删除成功 |
【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2的更多相关文章
- 【JEECG技术文档】JEECG 接口权限开发及配置使用说明
1.功能介绍 通过接口配置实现,对接口的访问权限控制和数据权限控制,接口时REST接口,接口权限认证机制使用Json web token (JWT) 接口权限调用流程: (1)通过接口用户的用户名 ...
- 【JEECG技术文档】Jeecg高级查询器
1. 背景 对于用户来讲查询功能按易用性分三个层次: 1)最简单查询操作是一个输入框,全文检索,如百度,后台实现技术使用搜索引擎,需要设计和建立索引,技术较为复杂,适用于文档和信息数据库检索,但是结果 ...
- 【JEECG技术文档】JEECG online 表单填值规则使用说明
1. 功能介绍 JEECG online规则值自动生成功能 为实现online表单数据初始化功能. 为实现图中红框字段初始化功能,需要完成下面4步操作: 1)编写规则实现类 2) 配置填值规则 3)o ...
- 【JEECG技术文档】JEECG在线聊天插件功能集成文档
原文地址:http://jeecg.iteye.com/blog/2320670 JEECG在线聊天插件功能集成文档 前提: 采用jeecg_3.6.3版本以上(Maven工程) 插件项目: 在线聊天 ...
- 【JEECG技术文档】表单配置-树形表单
表单配置支持树型表单了,具体效果如下图: 配置说明: 1.是否树:选择是. 2.树形表单父Id:表的自关联外键. 3.树形表单列表:显示树形图标的列,如上图中为[组织机构名称]. 4.默认值:最外层数 ...
- 【JEECG技术文档】online自定义模板的使用
一. 业务背景 客户需要快速开发一个信息采集的功能模块,并使用已规划好的页面,实现个性化页面展示,使用标准左右布局的Table或DIV风格的页面表现力不强,不能满足客户的个性化页面需要 二. 需求 1 ...
- 【JEECG技术文档】JEECG 组织机构导入V3.7
1.功能介绍 组织机构导入 提供组织机构模版导入功能,使用户更快速的创建组织机构 要使用组织机构导入功能需要完成以下步骤: 1. 下载模版excel 2. 填写组织机构信息 3. 点击导入-选择文件- ...
- 【JEECG技术文档】Online唯一校验使用说明
1.功能介绍 配置了唯一校验的字段,在录入和编辑页面中,动态查询用户输入值是否存在校验. 要使用online唯一校验功能必须先在online表单开发中配置唯一字段的校验方式为唯一校验. 2.配置唯一校 ...
- 【JEECG技术文档】JEECG部门管理员操作手册
功能介绍 使用部门管理员设置需要完成以下步骤: 1. 在“部门管理员设置”菜单配置权限以及分配管理员. 2. 在“部门角色管理”菜单配置角色,以及权限. 3. 在“部门用户角色授权”菜单分配角色到哪个 ...
随机推荐
- springmvc学习(五)
这次主要是记录一下 springmvc 关于异常处理 和 拦截的回顾 关于springmvc 异常处理:springmvc 提供了 HandlerExceptionResolver 异常处理解析接 ...
- blog决定不用二级域名,改为二级目录
看了一篇文章,受益匪浅,到底是用二级域名还是二级目录?已转载到得闲佬设计. 分析了一下得闲佬设计的因素,因为得闲佬设计是小站,流量很小,而且更新文章频率也不大,没必要把流量分出去做一个独立的站点 所以 ...
- folly无锁队列,尝试添加新的函数(续)
基于上一篇文章,dropHead取出节点后,删除节点,会出现内存访问的问题.按照这个逻辑,如果将移出的节点保存到一个无锁队列中,然后在需要节点的时候,从这个备用的无锁队列中取出节点,那么应该就可以避开 ...
- GPS获取坐标 显示Google map偏差计算
用手机获取GPS坐标 显示在手机地图偏差大约在100-200米左右,我把坐标放在 Maps.google.com 搜索坐标定位则相当精确. 可能是.....为了安全吧故意加的偏差 不过可以计算偏差使位 ...
- IBM MQ 中 amqsput : command not found的解决办法
MQ操作队列的命令有如下三条:命令功能1.amqsput 将消息放入队列中, 程序把之后的每一行标准输入作为一条独立的消息,读到 EOF 或空行时退出.注意,UNIX 上的 EOF 为 Ctrl+ ...
- CRM N:1 关系或者字段无法删除
点开详细信息查看那些实体引用了该组件.查看内容如下: 1 查看窗体上有无该字段; 2 查看视图中有无该字段; 3 查看试图的 筛选条件; 4 查看试图的 查找列; 5 发布之后再试试.
- ES6核心内容讲解
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...
- 梯度下降(Gradient Descent)相关概念
梯度,直观理解: 梯度: 运算的对像是纯量,运算出来的结果会是向量在一个标量场中, 梯度的计算结果会是"在每个位置都算出一个向量,而这个向量的方向会是在任何一点上从其周围(极接近的周围,学过 ...
- Java基础方面
1.作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package ...
- CS229 6.5 Neurons Networks Implements of Sparse Autoencoder
sparse autoencoder的一个实例练习,这个例子所要实现的内容大概如下:从给定的很多张自然图片中截取出大小为8*8的小patches图片共10000张,现在需要用sparse autoen ...