当前位置: 首页 > news >正文

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

目录

JavaEE-预编译-SQL

JavaEE-过滤器-Filter

JavaEE-监听器-Listen

思维导图


Java知识点

功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.

框架库:MyBatisSpringMVCSpringBootShiroLog4jFastJson

技术:ServletListenFilterInterceptor,JWT,AOP,待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充

安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

JavaEE-预编译-SQL

预编译SQL语句并执行 , 预防SQL注入问题

String safesql="select * from news where id=?";

PreparedStatement preparedStatement=connection.prepareStatement();

preparedStatement.setString(1,s);

ResultSet resultSet=preparedStatement.executeQuery();

提前编译好执行逻辑,你注入的语句不会改变原有逻辑!

  1. 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,表示将在执行时动态替换。
  2. 使用 PreparedStatement: PreparedStatement 是 Statement 的子接口,用于执行预编译的 SQL 语句。通过调用 connection.prepareStatement(safesql) 创建一个 PreparedStatement 对象。
  3. 设置参数: 使用 setXXX 方法设置占位符的值。在这里,使用 setString(1, s) 将字符串 **s 的值设置到第一个占位符上及sql语句中的==?==。**这种方式防止了 SQL 注入攻击,因为参数值是通过预编译的方式传递的,而不是通过直接拼接字符串。
  4. 执行查询: 调用 executeQuery() 执行查询,得到 ResultSet 对象。
  5. 处理结果集: 根据业务需要,处理查询结果集的数据。
  6. 打印最终的预编译 SQL 语句(用于调试): System.out.println(safesql); 这行代码用于在控制台打印最终生成的预编译 SQL 语句。这对于调试时检查生成的 SQL 语句是否正确是有帮助的。
// 预编译写法
String safesql = "SELECT * FROM news WHERE id=?";// 使用PreparedStatement
try (PreparedStatement preparedStatement = connection.prepareStatement(safesql)) {// 设置参数,防止SQL注入攻击preparedStatement.setString(1, s);// 执行查询ResultSet resultSet = preparedStatement.executeQuery();// 处理结果集...// 打印最终的预编译 SQL 语句(用于调试)System.out.println(safesql);
} catch (SQLException e) {e.printStackTrace();
}

使用不安全写法,可以进行sql注入,select * from news where id=1: 这是一个正常的SQL查询,目的是从名为"news"的表中选择ID为1的记录。

  1. union: 这是SQL的关键字,用于合并两个查询的结果集。
  2. select 1,2,3,version(),user(),database(): 这是一个注入的查询,它返回了一些固定的值(1、2、3)以及数据库的版本信息(version())、当前用户(user())和当前数据库(database())的信息。

通过将这两个查询合并,攻击者试图将恶意的查询注入到正常的查询中,从而获取数据库的敏感信息。这种类型的攻击被称为联合查询注入。

使用预编译写法,固定sql语句的逻辑,防止进行sql注入

JavaEE-过滤器-Filter

Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。


1、创建过滤器
2、过滤器内置方法
init  doFilter destroy
3、过滤器触发流程
@WebFilter("/xss")
<filter>
    <filter-name>xssFilter</filter-name>
    <filter-class>com.example.filter.xssFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>xssFilter</filter-name>
    <url-pattern>/xss</url-pattern>
</filter-mapping>
4、过滤器安全场景
Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等
内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw

1、创建新的项目

  • 创建新的项目FilterDemo1
  • 在对应的包名上,创建分类包filter与servlet
  • 在servlet下创建TestServlet ,并进行检测
  • 启动服务器,尝试进行Xss攻击,发现可以

2、创建过滤器

在对应的filter下创建XssFilter,并实现Filter 接口中的所有方法
3、过滤器内置方法
init(FilterConfig filterConfig):

  • 该方法在过滤器被初始化时调用,只会执行一次。
  • 用于执行一些初始化操作,例如获取配置信息等。

doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain):

  • 这是过滤器的主要方法,在每次请求被过滤时都会调用。
  • doFilter 方法中的 filterChain.doFilter(request, response) 表示继续执行过滤器链,如果没有更多的过滤器,最终将调用目标资源(例如 Servlet 或 JSP)。
  • 如果在 doFilter 中不调用 filterChain.doFilter,则请求将被拦截,不会继续传递。

destroy():

  • 该方法在过滤器被销毁时调用,只会执行一次。
  • 用于执行一些清理工作,释放资源等。
package com.example.filterdemo1.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter("/test")
public class XssFilter implements Filter {@Override//中间件启动后就自动运行public void init(FilterConfig filterConfig) throws ServletException {System.out.println("xss开启过滤");}@Override//中间件关闭后就自动运行public void destroy() {System.out.println("xss销毁过滤");}@Override//doFilter 访问路由触发的方法public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("xss正在过滤");//过滤代码就应该在放行前//如果符合就放行,不符合就过滤(拦截)//XSS过滤 接受参数值 如果有攻击payload 就进行拦截// 接受参数值 如果没有攻击payload 就进行放行HttpServletRequest request= (HttpServletRequest) servletRequest;String code = request.getParameter("code");if(!code.contains("<script>")){ //没有攻击payload//放行filterChain.doFilter(servletRequest,servletResponse);}else{System.out.println("存在XSS攻击");//继续拦截}}
}

4、过滤器触发流程

@WebFilter("/test")
<filter>
<filter-name>xssFilter</filter-name>
<filter-class>com.example.filter.xssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/test</url-pattern>
</filter-mapping>

5、利用过滤器简单实现:cookie身份验证
在servlet下创建AdminServlet,

@WebServlet("/admin")
public class AdminServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎进入管理员页面");}
}

在filter下创建AdminFileter,先不加入判断获取到浏览器本身的cookie值

  • 检查请求中是否包含名为 “user” 且值为 “admin” 的Cookie。如果符合条件,则放行请求;否则,输出 “非管理员访问”。
  • 相应进入管理员页面,必须先在浏览器中添加对应判断的cookie值
  • 如果对应不上则是非管理员访问,不予通过
package com.example.filterdemo1.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter("/admin")
public class AdminFileter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("admin身份检测开启");}@Overridepublic void destroy() {System.out.println("admin身份检测销毁");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("admin身份检测进行");//检测Cookie过滤HttpServletRequest request= (HttpServletRequest) servletRequest;Cookie[] cookies=request.getCookies();//对Cookie进行遍历获取for(Cookie c:cookies){String cName = c.getName();//获取cookie名String cValue = c.getValue();//获取cookie值System.out.println(cName);System.out.println(cValue);if(cName.contains("user") && cValue.contains("admin")){// filterChain 是一个 FilterChain 对象,代表过滤器链。// doFilter() 方法用于将请求和响应对象传递给过滤器链中的下一个过滤器或目标资源。// 即当前过滤通过filterChain.doFilter(servletRequest,servletResponse);}else {System.out.println("非管理员访问");}}}
}

XSS过滤

package com.example.filterdemo1.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@WebFilter("/test")
public class XssFilter implements Filter {@Override//中间件启动后就自动运行public void init(FilterConfig filterConfig) throws ServletException {System.out.println("xss开启过滤");}@Override//中间件关闭后就自动运行public void destroy() {System.out.println("xss销毁过滤");}@Override//doFilter 访问路由触发的方法public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("xss正在过滤");//过滤代码就应该在放行前//如果符合就放行,不符合就过滤(拦截)//XSS过滤 接受参数值 如果有攻击payload 就进行拦截// 接受参数值 如果没有攻击payload 就进行放行HttpServletRequest request= (HttpServletRequest) servletRequest;String code = request.getParameter("code");if(!code.contains("<script>")){ //没有攻击payload//放行filterChain.doFilter(servletRequest,servletResponse);}else{System.out.println("存在XSS攻击");//继续拦截}}
}

开启过滤后,发现成功拦截Xss攻击

内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw

JavaEE-监听器-Listen

参考:https :// blog . csdn . net / qq_52797170 / article / details / 124023760

-监听ServletContextHttpSessionServletRequest等域对象创建和销毁事件

-监听域对象的属性发生修改的事件

-监听在事件发生前、发生后做一些必要的处理

1、创建监听器

2、监听器内置方法

3、监听器触发流程

@WebListener

<listener>

.......

</listener>

4、监听器安全场景

代码审计中分析执行逻辑触发操作,红队内存马植入,蓝队清理内存马等

创建新的项目

  1. 创建新的项目ListenDemo1
  2. 在对应的包名上,创建分类包listenerr与servlet
  3. 在servlet下创建CSession DSession,并进行检测
  4. DSession一个简单的Servlet,对应一个/ds的URL映射。在收到GET请求时,它会销毁当前请求的HttpSession

listener/ListenSession

package com.example.listendemo1.listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;@WebListener
public class ListenSession implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {//监听检测有Session创建就会执行这里System.out.println("监听器监听到了session创建");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {//监听检测有Session销毁就会执行这里System.out.println("监听器监听到了session销毁");}
}

这段代码定义了一个实现 HttpSessionListener 接口的监听器类 ListenSession,用于监听HttpSession的创建和销毁事件。

对于HttpSessionListener:

  • 当一个新的HttpSession被创建时,sessionCreated方法将被调用。
  • 当一个HttpSession被销毁时,sessionDestroyed方法将被调用。

Servlet/CSession

package com.example.listendemo1.Servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;@WebServlet("/cs")
public class CSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Servlet里面创建Session");//创建Sessionreq.getSession();}
}

Servlet/DSession

package com.example.listendemo1.Servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/ds")
public class DSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Servlet里面销毁Session");//销毁Sessionreq.getSession().invalidate();}
}

监听器的触发流程:

在 web.xml 中增加如下内容放置在 web-app 标签内

@WebListener
<listener>
.......
</listener>
  1. 注册监听器:在Web应用中,你需要将监听器注册到相应的组件上。例如,在web.xml文件中配置监听器,或者使用注解(如@WebListener)标记监听器类。
  2. 事件发生:当与监听器关联的特定事件在Web应用中发生时,监听器会被触发。
  3. 调用监听器方法:监听器类中实现的相应方法(如sessionCreated、sessionDestroyed等)将被调用。这些方法包含与事件相关的信息,允许监听器执行特定的逻辑。
  4. 执行自定义逻辑:在监听器方法中,你可以编写自定义的逻辑以响应事件。这可能包括记录日志、修改数据、发送通知等。

思维导图

相关文章:

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

目录 JavaEE-预编译-SQL JavaEE-过滤器-Filter JavaEE-监听器-Listen 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架库&#xff1a;MyBatis&#…...

Log4j如何支持多线程环境?你如何优化Log4j的性能?

Log4j如何支持多线程环境&#xff1f; Log4j 通过其内部设计来支持多线程环境&#xff0c;确保在多线程应用程序中能够安全地使用。以下是 Log4j 支持多线程环境的一些关键方面&#xff1a; 线程安全性&#xff1a; Log4j 的 Logger 类和 Appender 类都是设计为线程安全的。这…...

golang sync.Pool 指针数据覆盖问题

场景 1. sync.Pool设置 var stringPool sync.Pool{New: func() any {return new([]string)}, }func NewString() *[]string {v : stringPool.Get().(*[]string)return v }func PutString(s *[]string) {if s nil {return}if cap(*s) > 2048 {s nil} else {*s (*s)[:0]…...

VUE+内置iframe传值失效问题解决

起因&#xff1a; 公司业务需要计算建筑物截收面积&#xff0c;然后我采用的是openCV来计算&#xff0c;在vue内部引用不了&#xff0c;然后就采用了iframe原生html来完成&#xff1b;功能实现了我想让iframe和vue通信&#xff1b;然后用原有方式试了多次都失败了&#xff0c;i…...

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…...

Go Zero微服务个人探究之路(十六)回顾api服务和rpc服务的本质

目录 前言 正文 API&#xff08;Application Programming Interface&#xff09; RPC&#xff08;Remote Procedure Call&#xff09; API 与 RPC 的关系 分布式部署 API 和 RPC 结语 前言 go-zero 是一个基于 Go 语言的微服务框架&#xff0c;它提供了一套简洁的编程模…...

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)

摘要&#xff1a;开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间…...

Spring体系架构

目录 核心容器(Core Container) 数据访问/集成(Data Access/Integration) Web开发(Web)...

【PLC】现场总线和工业以太网汇总

1、 现场总线 1.1 什么是现场总线 1&#xff09;非专业描述&#xff1a; 如下图&#xff1a;“人机界面”一般通过以太网连接“控制器(PLC)”&#xff0c;“控制器(PLC)”通过 “现场总线”和现场设备连接。 2&#xff09;专业描述&#xff08;维基百科&#xff09; 现场总线…...

【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM分析

大家好&#xff0c;我是锋哥。今天分享关于JVM分析的JVM面试题&#xff0c;希望对大家有帮助&#xff1b; 查看JVM进程号的命令是什么? 可以使用 ps ‐ef 和 jps ‐v 等等。 怎么查看剩余内存? 比如&#xff1a; free ‐m, free ‐h, top 命令等等。 1000道 互联网大厂Jav…...

Mysql锁与MVCC

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 exlpain字段解析ACID的原理日志引擎整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a; 乐观锁&#xff08;Optimistic Locking&#xff09;&#xff1a;假设并发操作时不会发…...

rancher是什么

Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年&#xff0c;是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程&#xff0c;帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…...

阿里云服务器安全狗免费使用多引擎智能查杀引擎

云服务器具有按量付费、降低综合成本等诸多优势&#xff0c;受到很多企业的欢迎。 因此&#xff0c;目前使用的云服务器越来越多。 阿里云是目前云服务器中最具影响力的品牌&#xff0c;因此选择阿里云服务器的用户数量也是最多的。 那么阿里云服务器需要安装杀毒软件吗&#x…...

使用rust实现九九乘法表

rust目前拥有接近c/c的运行速度以及更快的编码支持&#xff0c;所以是很值得学习得一门语言。rust的语法及设计理念与其他的语言也有许多的不同之处。比如其特有的所有权属性。可以让开发者快速的开发出高效的运行程序。对于内存的管理也有极好的管理方案。 在这里使用rust语言…...

突破编程_C++_设计模式(简单工厂模式)

1 简单工厂模式的概念 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是设计模式中的一种创建型模式。它的主要目的是将对象的实例化与使用解耦&#xff0c;使得客户端无需关心对象的创建细节&#xff0c;只需通过工厂类来获取所需的对象。 在简单工厂模式中&a…...

C语言——快速排序

C语言——快速排序 一、 含义二、算法思想三、实现步骤代码实现 一、 含义 快速排序算法是在几种排序算法中效率最高的一个排序算法了&#xff0c;故称为快速排序&#xff0c;它的时间复杂度为&#xff1a;O(nlog2n)&#xff0c;相比冒泡排序算法的O(n2)有很大的提升。 二、算…...

FP独立站获客秘籍大揭秘:简单高效,一看就会!

跨境电商的大潮中&#xff0c;越来越多的卖家选择跳出第三方平台的框架&#xff0c;拥抱独立站的自由与机遇。但独立站获客难、成本高的问题&#xff0c;也让不少卖家头疼不已。别担心&#xff0c;今天就来给大家揭秘FP独立站获客的简单高效方法&#xff01; 首先&#xff0c;…...

英伟达tx2光驱烧录功能支持

今天得到一个任务&#xff0c;是在当前nvidia tx2平台上使能usb cdrom并且调试烧录功能。首先测试给到的信息是不能在平台上使用&#xff08;废话嘛&#xff0c;能用还用我干嘛&#xff09; 拿到本地ubuntu机器上看了下&#xff0c;使用brasero等软件可以顺利烧录。 此时捕获了…...

关于stm32(CubeMX+HAL库)的掉电检测以及flash读写

1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数&#xff0c;我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …...

Elastic script_score的使用

script_score介绍 在Elasticsearch中&#xff0c;script_score是在function_score查询中的一种功能强大的方式&#xff0c;允许用户使用内置Painless脚本语言或者其他支持的语言来动态计算每个文档的评分 script_score语法 GET /<索引名>/_search {"query":…...

【Spring Boot 3】获取已注入的Bean

【Spring Boot 3】获取已注入的Bean 背景介绍开发环境开发步骤及源码工程目录结构总结 背景 软件开发是一门实践性科学&#xff0c;对大多数人来说&#xff0c;学习一种新技术不是一开始就去深究其原理&#xff0c;而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历…...

C# 对于点位置的判断

1.判断点是否在一群点内部 要判断一个点是否在一个由多个点围成的多边形内部&#xff08;例如一圈点&#xff09;&#xff0c;可以使用射线法&#xff08;Ray Casting Algorithm&#xff09;来实现。以下是一个简单的 C# 实现示例 using System;public class Point {public d…...

最新CLion + STM32 + CubeMX 开发环境搭建

网上有不少相关教程&#xff0c;但都是基于老版本Clion&#xff0c;新版有一些改变&#xff0c;但整体是简单了。 PS&#xff1a;本教程基于CLion 2023.3.4 安装所需工具参考&#xff1a;Clion搭建stm32开发环境&#xff08;STM32F103C8T6&#xff09;&#xff0c;有这一篇就够…...

【Python3】观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种常见的设计模式&#xff0c;用于定义对象之间的一对多依赖关系&#xff0c;使得一个对象的状态改变能够通知所有依赖于它的对象并自动更新。 在观察者模式中&#xff0c;有两个核心角色&#xff1a; Subject&#xf…...

HTML5 Web Worker之性能优化

描述 由于 JavaScript 是单线程的&#xff0c;当执行比较耗时的任务时&#xff0c;就会阻塞主线程并导致页面无法响应&#xff0c;这就是 Web Workers 发挥作用的地方。它允许在一个单独的线程&#xff08;称为工作线程&#xff09;中执行耗时的任务。这使得 JavaScript 代码可…...

应对恶意IP攻击的有效方法

在当今数字化时代&#xff0c;网络攻击已经成为了互联网安全的重大挑战之一。恶意IP攻击是网络安全领域中的一种常见威胁&#xff0c;它可能导致数据泄露、服务中断、系统瘫痪等严重后果。因此&#xff0c;有效地应对恶意IP攻击至关重要。IP数据云将深入探讨如何应对恶意IP攻击…...

如何使用“Docker registry创建本地仓库,在服务器之间进行文件push和pull”?

1.1、在服务器1&#xff0c;运行registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.11.2、编辑/etc/docker/daemon.json 文件&#xff0c; 192.168.xxx.xxx 换成你自己 registry 服务的地址 sudo na…...

Rocky Linux - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Redhat Linux版环境发布之后&#xff0c;近日我又制作了基于Rocky Enterprise Linux 的P6虚拟机环境&#xff0c;同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primav…...

API 管理调研

当前大部分团队内 API 管理都是依赖 Postman&#xff0c;postman最大的问题是共享问题&#xff0c;如果我要使用另外一个人已经调试好的 API 非常麻烦。因此&#xff0c;能实现协作的 API 管理将极大提升效率。 Yapi https://github.com/YMFE/yapi https://hellosean1025.gi…...

在centOS服务器安装docker,并使用docker配置nacos

遇到安装慢的情况可以优先选择阿里镜像 安装docker 更新yum版本 yum update安装所需软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep…...