SQLmap JSON 格式的数据注入
现在越来越多的网站开始使用 RESTFUL 框架,数据传输使用 JSON,那么这种情况下我们如何使用 SQLmap 进行自动化注入呢? 能使用 * 指定注入点吗? 先说结论:对于 JSON 数据的 SQL 注入使用 * 是错误的! 首先需要着重强调一下,网上有很多文章说可以使用*来指定注入点,但经过我的实测,SQLmap 发送的数据包会被强制转换为普通格式。 我们可以使用-vvv参数来查看 SQLmap 发送的测试数据:
1 |
sqlmap -u https://www.example.com —data {"externalCode":"DCS214120101000456814087*"} --risk=3 -vvv |
如上图所示,可以看到使用*时,JSON 格式的 POST 数据被强制转换为普通格式,如此发送到服务端当然是没办法识别的。 正确的用法: -r 参数 对于 JSON 格式的注入,正确用法是: 将 BurpSuite 中的数据包保存到本地 sql.txt 2. 使用 -r 参数来注入,SQLmap 会自动识别 JSON 格式并发现注入点:
1 |
sqlmap -r sql.txt |
此时,如果使用-vvv参数查看,你会发现发送的测试数据包仍然是 JSON 格式: 这种用法才是正确的. 两个比较容易采坑的点 如果是 HTTPS站点,需要手动在 Host 字段后加上 443 端口,就像下面这样: 手动在 Host 字段添加 :443 端口 2. 如果要指定 POST 数据中 JSON 参数注入点,-p参数是不支持的,需要手动添加*: from:https://zhuanlan.zhihu.com/p/265405012
View Details渗透测试工具Burp Suite详解
Burp Suite 的安装 Burp Suite是一款集成化的渗透测试工具,包含了很多功能,可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。 Burp Suite由Java语言编写,基于Java自身的跨平台性,使这款软件学习和使用起来更方便。Burp Suite不像其他自动化测试工具,它需要手工配置一些参数,触发一些自动化流程,然后才会开始工作。 Burp Suite可执行程序是Java文件类型的jar文件,免费版可以从官网下载。免费版的Burp Suite会有许多限制,无法使用很多高级工具,如果想使用更多的高级功能,需要付费购买专业版。专业版与免费版的主要区别有以下三点。 Burp Scanner 工作空间的保存和恢复 拓展工具,如Target Analyzer、Content Discovery和Task Scheduler burp suite就是一个抓包、改包工具 Burp的安装一共分为三步: 1、java的安装 2、环境变量的配置 3、运行burp burp的安装与基本使用 java环境 从java官网进行下载:搜索java jdk 安装完成之后,配置环境变量:将C:\Program Files\Java\jdk1.8.0_201复制到 点击确定 然后打开bin目录,再将目录C:\Program Files\Java\jdk1.8.0_201\bin复制到 点击确定 现在可以用cmd指令输入javac输入java也可以 出现如图情况,说明环境变量配置成功。 下载burp 下载地址:https://portswigger.net/burp 我这里安装的是exe文件 双击安装,一直next——》finish 打开——》I accept——》弹框选delete——》next——》start burp 免费版本没有Scanner Burp Suite入门 设置代理 burp suite代理工具是以拦截代理的方式,拦截所有通过代理的网络流量,如客户端的请求数据、服务端的返回信息等。burp suite主要拦截HTTP和HTTPS 写协议的流量,通过拦截,burp以中间人的方式对客户端的请求数据、服务端的返回信息做各种处理,以达到安全测试的目的。 在日常工作中,最常用的web客户端就是web浏览器,我们可以通过设置代理信息,拦截web浏览器的流量,并对经过burp代理的流量数据进行处理。burp运行之后,Burp Proxy默认本地代理端口为8080。如图: HTTP的代理 以Firedox浏览器为例: 打开菜单——》选项——》网络代理——》设置——》手动配置代理 127.0.0.1端口是8080 如上图所示,设置HTTP代理为127.0.0.1,端口为8080,与burp Proxy中的代理一致 端口在0~65535之间设置 手动代理:代理到本机,因为想让浏览器通过本机把流量发送到这个端口,再由burp监听到,把包拦下来(端口的选择要和burp一样) HTTP代理(因为抓的是http的包) 设置完后,burp就可以抓包了。 重新打开: SSL看做HTTPS就行了 HTTPS的代理 我们要怎么做才能抓HTTPS的包呢? 如果要抓HTTP的包要用HTTP代理 如果要抓HTTPS的包,要用HTTPS代理(SSL proxy) HTTP默认走的是80端口,HTTPS走的是443端口。两者端口不一样,要代理HTTPS就一定要用SSL去代理 设置完代理就可以了吗?不行 HTTPS(S表示security),多添加了一套SSL层(在TCP和HTTP中间),作加密的。 burp suite有一个证书:http://burp/(输入的是http,所以一定要代理http 才可以访问http的网站,代理的是https就可以访问https的网站) 安装证书后就可以解密百度传回的数据 导入刚刚下载的证书 这个证书的名字叫PortSwigger CA 导入后弹出的弹框(选第一个也行,都选中也行) 导入这个证书就可以解密https协议里面的乱码数据了 现在抓一个百度的包吧! 若只设置了SSL proxy,能不能抓http是包?不能 因为没有代理http的,只代理了https的,SSL就理解为HTTPS,所有要抓http,要设置https代理。 总结:抓https的包 抓https就代理ssl,抓http就代理http […]
View Details基于vue的 表单设计器(拖拽生成表单)
日常开发时想要快速构建节省时间或者功能需求需要拖拽生成表单,推荐使用以下表单设计器。 1.基于vue+elementui 的表单设计及代码生成器 Form Generator Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 码云仓库: form-generator: Element UI表单设计及代码生成器 演示地址: form-generator 安装依赖:
1 |
npm install |
JSON解析器:
1 2 |
// 安装 npm i form-gen-parser |
vscode插件 form-generator-plugin 此项目将form-generator的vscode-plugin分支封装为一个vscode插件,拓展了form-generator的文件写入能力; 帮助使用element UI的开发者完成基本的表单代码搭建任务,减少重复的劳动。 2. 基于vue+ant-design-vue的表单设计器 k-form-design 设计器布局参考form-generator项目,基于vue和ant-design-vue实现的表单设计器,样式使用less作为开发语言,主要功能是能通过简单操作来生成配置表单,生成可保存的JSON数据,并能将JSON还原成表单,使表单开发更简单更快速。 github仓库:https://github.com/Kchengz/k-form-design 演示地址:http://cdn.kcz66.com/form-design.html 组件 KFormDesign 表单设计器(基于可视化操作快速设计出表单页面,生成配置json或页面) KFormBuild 表单构建器(根据设计器中获取的配置json数据,快速构建出表单页面) 安装
1 2 3 4 5 |
# 使用yarn yarn add k-form-design # 使用npm npm i k-form-design --save |
引入组件
1 2 3 4 |
// 在main.js引入 import KFormDesign from 'k-form-design' import 'k-form-design/lib/k-form-design.css' Vue.use(KFormDesign) |
使用组件
1 2 3 4 5 |
<template> <div> <k-form-design /> </div> </template> |
3.基于vue的表单生成器(支持iview,element-ui,ant-design-vue) form-create form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持3个UI框架,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件。 安装 iview
1 |
npm install @form-create/iview |
iview
1 |
npm install @form-create/iview4 |
element-ui
1 |
npm install @form-create/element-ui |
ant-design-vue
1 |
npm install @form-create/ant-design-vue |
4.基于vue+ElementUI的表单设计器 form-designer 码云仓库:https://gitee.com/wurong19870715/formDesigner 演示地址:http://wurong19870715.gitee.io/formdesigner from:https://blog.csdn.net/weixin_43765747/article/details/122995904
View DetailsJava 获取当前时间所在自然周起止时间及自然周中的每一天
有的时候需要获取当前时间所在自然周中的起始和截止时间,或者某个时间段内里的每一天的日期 1、先来解决获取自然周中的起止时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** * 获取当前时间所在自然周的起止日期 * * @return */ public static Map<String, String> weekBeginningAndEnding() { Map<String, String> map = new HashMap<>(); //获取当前自然周中每天的日期集合 Date date = new Date(); DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); //这里设置一周开始时间是星期一 c.setTime(date); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday String beginTime = format.format(c.getTime()); //获取当前自然周的起始时间 map.put("begin", beginTime); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday String endTime = format.format(c.getTime()); //当前自然周的截止时间 map.put("end", endTime); return map; } |
2、根据时间段来获取当前时间段内的每一天
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * 获取开始和结束之间的每一天 * * @param beginTime 开始时间 * @param endTime 结束时间 * @param type 返回列表中的时间格式 * @return 返回日期字符串列表 */ public static List<String> weekDays(Date beginTime, Date endTime,String type) { DateFormat format=new SimpleDateFormat(type); //设置开始时间 Calendar calStart = Calendar.getInstance(); calStart.setTime(beginTime); //设置结束时间 Calendar calEnd = Calendar.getInstance(); calEnd.setTime(endTime); //返回的日期集合 List<String> dateList = new ArrayList<String>(); //每次循环给calStart日期加一天,直到calBegin.getTime()时间等于dEnd dateList.add(format.format(calStart.getTime())); while (endTime.after(calStart.getTime())) { //根据日历的规则,为给定的日历字段添加或减去指定的时间量 calStart.add(Calendar.DAY_OF_MONTH, 1); dateList.add(format.format(calStart.getTime())); } return dateList; } |
如果对你有用,点个赞吧!!! from:https://blog.csdn.net/weixin_44826433/article/details/110677362
View DetailsJava获得当前日期是星期几
第一种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * 获取当前日期是星期几<br> * * @param date * @return 当前日期是星期几 */ public String getWeekOfDate(Date date) { String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; Calendar cal = Calendar.getInstance(); cal.setTime(date); int w = cal.get(Calendar.DAY_OF_WEEK) - 1; if (w < 0) w = 0; return weekDays[w]; } |
第二种方法: 使用SimpleDateFormat格式化日期
1 2 3 4 |
Date date = new Date(); SimpleDateFormat dateFm = new SimpleDateFormat("EEEE"); String currSun = dateFm.format(date); System.out.println(currSun); |
注:格式化字符串存在区分大小写 对于创建SimpleDateFormat传入的参数:EEEE代表星期,如“星期四”;MMMM代表中文月份,如“七月”;MM代表月份,如“07”;yyyy代表年份,如“2017”;dd代表天,如“05” from:https://blog.csdn.net/u013456370/article/details/74373410
View Details科普:Kafka是啥?干嘛用的?
Kafka概述:
Kafka由 linked-in 开源 。
kafka-高产出的分布式消息系统(A high-throughput distributed messaging system)。
Kafka是一个高吞吐、分布式、基于发布订阅的消息系统,利用Kafka技术可以在廉价的PC Server上搭建起大规模消息系统。
Kafka的特性:
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作;
可扩展性:kafka集群支持热扩展;
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败);
高并发:支持数千个客户端同时读写;
支持实时在线处理和离线处理:可以使用Storm这种实时流处理系统对消息进行实时进行处理,同时还可以使用Hadoop这种批处理系统进行离线处理;
Docker 安装 MongoDB
MongoDB 是一个免费的开源跨平台面向文档的 NoSQL 数据库程序。 1、查看可用的 MongoDB 版本 访问 MongoDB 镜像库地址: https://hub.docker.com/_/mongo?tab=tags&page=1。 可以通过 Sort by 查看其他版本的 MongoDB,默认是最新版本 mongo:latest。 你也可以在下拉列表中找到其他你想要的版本: 此外,我们还可以用 docker search mongo 命令来查看可用版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ docker search mongo NAME DESCRIPTION STARS OFFICIAL AUTOMATED mongo MongoDB document databases ... 1989 [OK] mongo-express Web-based MongoDB admin int... 22 [OK] mvertes/alpine-mongo light MongoDB container 19 [OK] mongooseim/mongooseim-docker MongooseIM server the lates... 9 [OK] torusware/speedus-mongo Always updated official Mon... 9 [OK] jacksoncage/mongo Instant MongoDB sharded cluster 6 [OK] mongoclient/mongoclient Official docker image for M... 4 [OK] jadsonlourenco/mongo-rocks Percona Mongodb with Rocksd... 4 [OK] asteris/apache-php-mongo Apache2.4 + PHP + Mongo + m... 2 [OK] 19hz/mongo-container Mongodb replicaset for coreos 1 [OK] nitra/mongo Mongo3 centos7 1 [OK] ackee/mongo MongoDB with fixed Bluemix p... 1 [OK] kobotoolbox/mongo https://github.com/kobotoolb... 1 [OK] valtlfelipe/mongo Docker Image based on the la... 1 [OK] |
2、取最新版的 MongoDB 镜像 这里我们拉取官方的最新版本的镜像:
1 |
$ docker pull mongo:latest |
3、查看本地镜像 使用以下命令来查看是否已安装了 mongo:
1 |
$ docker images |
在上图中可以看到我们已经安装了最新版本(latest)的 mongo 镜像。 4、运行容器 安装完成后,我们可以使用以下命令来运行 mongo 容器:
1 |
$ docker run -itd --name mongo -p 27017:27017 mongo --auth |
参数说明: -p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。 --auth:需要密码才能访问容器服务。 5、安装成功 最后我们可以通过 docker ps 命令查看容器的运行信息: 接着使用以下命令添加用户和设置密码,并且尝试连接。
1 2 3 4 5 |
$ docker exec -it mongo mongo admin # 创建一个名为 admin,密码为 123456 的用户。 > db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); # 尝试使用上面创建的用户信息进行连接。 > db.auth('admin', '123456') |
MongoDB 6.0 及以上版本使用以下命令:
1 |
docker exec -it mongo mongosh admin |
from:https://www.runoob.com/docker/docker-install-mongodb.html
View DetailsJava Xmll转Json工具类
先看效果: xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?xml version="1.0" encoding="utf-8" ?> <auibinsurancecallback> <policyinfo> <transtype>TKTS</transtype> <eticketno>xxx</eticketno> <flightnumber>xxx</flightnumber> <flightdate>2019-10-16</flightdate> <operatetime>2019-10-16 17:20:00</operatetime> <insureno>1910161720056066735</insureno> <agreeno>102160199</agreeno> <policyno/> <policyurl><![CDATA[]]></policyurl> </policyinfo> <returninfo> <serialnumber>2019103015284949545354</serialnumber> <retruncode>0</retruncode> <errormessage><![CDATA[]]></errormessage> </returninfo> <list> <item> <name>john</name> <age>22</age> <log> <record>1</record> <record>2</record> </log> </item> <item> <name>lucy</name> <age>23</age> <log> <record> <id>1</id> <event>event1</event> </record> <record> <id>2</id> <event>event2</event> </record> </log> </item> </list> <list2> <item> <name>lily</name> <age>24</age> </item> </list2> </auibinsurancecallback> |
json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
{ "auibinsurancecallback": { "policyinfo": { "transtype": "TKTS", "eticketno": "xxx", "flightnumber": "xxx", "flightdate": "2019-10-16", "operatetime": "2019-10-16 17:20:00", "insureno": "1910161720056066735", "agreeno": "102160199", "policyno": "", "policyurl": "" }, "returninfo": { "serialnumber": "2019103015284949545354", "retruncode": "0", "errormessage": "" }, "list": { "item": [ { "name": "john", "age": "22", "log": { "record": [ { "record": "1" }, { "record": "2" } ] } }, { "name": "lucy", "age": "23", "log": { "record": [ { "id": "1", "event": "event1" }, { "id": "2", "event": "event2" } ] } } ] }, "list2": { "item": { "name": "lily", "age": "24" } } } } |
依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 --> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.42</version> </dependency> |
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
package org.longsheng.util; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import java.util.ArrayList; import java.util.List; /** * Xml转JSON工具包 */ @Slf4j public class XmlToJsonUtil { /** * 转换为json字符串 * * @param xmlString xml字符串 * @return json字符串 */ public static String toJsonString(String xmlString) { JSONObject result = toJson(xmlString); if (result == null) { return null; } return result.toString(); } /** * 转换为json对象 * * @param xmlString xml字符串 * @return json对象 */ public static JSONObject toJson(String xmlString) { try { Document doc = DocumentHelper.parseText(xmlString); return toJson(doc); } catch (DocumentException e) { log.error("{}===>{}===>exception: {} | {}", Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName(), e.getMessage(), e.getStackTrace()); } return null; } /** * 转换为json对象 * * @param document xml对象 * @return json对象 */ public static JSONObject toJson(Document document) { if (document == null) { return null; } try { Element root = document.getRootElement(); List<Element> elements = root.elements(); JSONObject jsonObject = new JSONObject(); jsonObject.put(root.getName(), elementToJson(elements)); return jsonObject; } catch (Exception e) { log.error("{}===>{}===>exception: {} | {}", Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName(), e.getMessage(), e.getStackTrace()); } return null; } /** * 递归读取节点,并简单判定节点状态(值、对象、列表三种状态) * * @param elements * @return */ public static JSONObject elementToJson(List<Element> elements) { if (elements == null || elements.isEmpty()) { return null; } JSONObject result = new JSONObject(); // single object if (elements.size() == 1) { Element element = elements.get(0); List<Element> children = element.elements(); result.put(element.getName(), children.isEmpty() ? element.getText() : elementToJson(children)); return result; } // multi-object if (!elements.get(0).getName().equals(elements.get(1).getName())) { result.clear(); List<Element> children; for (Element element : elements) { children = element.elements(); result.put(element.getName(), children.isEmpty() ? element.getText() : elementToJson(children)); } return result; } // array list List<JSONObject> jsonList = new ArrayList<>(); List<Element> children; for (Element element : elements) { children = element.elements(); result = new JSONObject(); if (children.isEmpty()) { result.put(element.getName(), element.getText()); } else { result = elementToJson(children); } jsonList.add(result); } result = new JSONObject(); result.put(elements.get(0).getName(), jsonList); return result; } /** * 从json对象中获取指定名称的json数组 * * @param jsonObject json对象 * @param nodeName json数组节点名称 * @return json数组 */ public static JSONArray getArray(JSONObject jsonObject, String nodeName) { if (jsonObject == null || nodeName == null || nodeName.isEmpty()) { return null; } Object node = jsonObject.get(nodeName); if (node == null) { return null; } JSONArray result = new JSONArray(); if (node instanceof JSONObject) { result.add(node); return result; } if (node instanceof ArrayList) { result = jsonObject.getJSONArray(nodeName); } return result; } public static void main(String[] args) { String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" + "<auibinsurancecallback>\n" + "\t<policyinfo>\n" + "\t\t<transtype>TKTS</transtype>\n" + "\t\t<eticketno>xxx</eticketno>\n" + "\t\t<flightnumber>xxx</flightnumber>\n" + "\t\t<flightdate>2019-10-16</flightdate>\n" + "\t\t<operatetime>2019-10-16 17:20:00</operatetime>\n" + "\t\t<insureno>1910161720056066735</insureno>\n" + "\t\t<agreeno>102160199</agreeno>\n" + "\t\t<policyno/>\n" + "\t\t<policyurl><![CDATA[]]></policyurl>\n" + "\t</policyinfo>\n" + "\t<returninfo>\n" + "\t\t<serialnumber>2019103015284949545354</serialnumber>\n" + "\t\t<retruncode>0</retruncode>\n" + "\t\t<errormessage><![CDATA[]]></errormessage>\n" + "\t</returninfo>\n" + "\t<list>\n" + "\t\t<item>" + "\t\t\t<name>john</name>" + "\t\t\t<age>22</age>" + "\t\t\t<log>" + "\t\t\t\t<record>1</record>" + "\t\t\t\t<record>2</record>" + "\t\t\t</log>" + "\t\t</item>\n" + "\t\t<item>" + "\t\t\t<name>lucy</name>" + "\t\t\t<age>23</age>" + "\t\t\t<log>" + "\t\t\t\t<record>" + "\t\t\t\t\t<id>1</id>" + "\t\t\t\t\t<event>event1</event>" + "\t\t\t\t</record>" + "\t\t\t\t<record>" + "\t\t\t\t\t<id>2</id>" + "\t\t\t\t\t<event>event2</event>" + "\t\t\t\t</record>" + "\t\t\t</log>" + "\t\t</item>\n" + "\t</list>\n" + "\t<list2>\n" + "\t\t<item>" + "\t\t\t<name>lily</name>" + "\t\t\t<age>24</age>" + "\t\t</item>\n" + "\t</list2>\n" + "</auibinsurancecallback>"; JSONObject json = toJson(xml); System.out.println(xml); System.out.println(); assert json != null; System.out.println(json.toJSONString()); JSONArray array1 = getArray(json.getJSONObject("auibinsurancecallback").getJSONObject("list"), "item"); JSONArray array2 = getArray(json.getJSONObject("auibinsurancecallback").getJSONObject("list2"), "item"); System.out.println(); System.out.println(array1.toJSONString()); System.out.println(array2.toJSONString()); } } |
View Details
QPS、TPS、并发用户数、吞吐量关系
1、QPS
QPS Queries Per Second 是每秒查询率 ,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准, 即每秒的响应请求数,也即是最大吞吐能力。
2、TPS
TPS Transactions Per Second 也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,
Spring Boot 2.7.15集成Nacos 2.2.3
依赖
1 2 |
// https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter implementation group: 'com.alibaba.boot', name: 'nacos-config-spring-boot-starter', version: '0.2.12' |
配置文件 application.yml
1 2 3 4 5 |
nacos: config: server-addr: 127.0.0.1:8848 username: xxxx password: xxxxxx |
注解 @NacosPropertySource
1 2 3 4 5 6 7 8 9 10 |
@SpringBootApplication @MapperScan("com.w3cnet.xxx.repository") @NacosPropertySource(dataId = "xxx-prod.yml", autoRefreshed = true) public class XxxxApplication { public static void main(String[] args) { SpringApplication.run(XxxxApplication.class, args); } } |
注解 @NacosValue
1 2 |
@NacosValue(value = "${xxx.url}", autoRefreshed = true) private String xxxUrl; |
参考资料:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html
View Details