API接口管理平台解决方案

article/2025/10/2 15:09:03

一、背景和目的

Swagger 在目前企业中作为前后端开发对接的技术已经得到了非常广泛的应用,后端开发人员只需要根据 OpenAPI 官方定义的注解就可以把接口文档非常丰富的呈现给前端接口对接人员。并且接口文档是随着代码的变动实时更新,同时提供了在线 HTML 文档辅助开发人员可以进行接口联调测试,这大大省去了技术人员写文档的烦恼,也提升了企业开发的效率,减少沟通成本。

  • 代码变,文档变。只需要少量的注解,Swagger 就可以根据代码自动生成 API 文档,很好的保证了文档的时效性。

  • 跨语言性,支持 40 多种语言。

  • Swagger UI 呈现出来的是一份可交互式的 API 文档,我们可以直接在文档页面尝试 API 的调用,省去了准备复杂的调用参数的过程。

  • 还可以将文档规范导入相关的工具(例如 PostmanSoapUI, 这些工具将会为我们自动地创建自动化测试。

Knife4j 是一个 SwaggerUI 的增强工具,同时也提供了一些增强功能,使用 Java+Vue 进行开发,帮助开发者能在编写接口注释时更加完善,基于 OpenAPI 的规范完全重写 UI 界面,左右布局的方式也更加适合国人的习惯。

1.、URI

URI 表示资源,资源一般对应服务器端领域模型中的实体类。

URI规范

不用大写;
用中杠-不用下杠_
参数列表要encode
URI中的名词表示资源集合,使用复数形式。

2、Request

GET:查询

GET /zoos

POST:创建单个资源。POST一般向资源集合uri发起

POST /animals  //新增动物

PUT:更新单个资源(全量),客户端提供完整的更新后的资源。与之对应的是 PATCHPATCH 负责部分更新,客户端提供要更新的那些字段。PUT/PATCH一般向单个资源uri发起

PUT /animals/1

DELETE:删除

DELETE /zoos/1/animals  //删除id为1的动物园内的所有动物

HEAD / OPTION 用的不多,就不多解释了。

安全性和幂等性

安全性:不会改变资源状态,可以理解为只读的;

幂等性:执行1次和执行N次,对资源状态改变的效果是等价的。

.

安全性

幂等性

GET

POST

×

×

PUT

×

DELETE

×

安全性和幂等性均不保证反复请求能拿到相同的response。以 DELETE 为例,第一次DELETE返回200表示删除成功,第二次返回404提示资源不存在,这是允许的。

3、环境

场景1:测试环境

便于开发人员调试,后台和前端开发人员协作,以及对外公布API使用

application.yml

swagger:show: true

场景2:生产环境

在生产环境也会启用,就会存在一定的安全风险。

application.yml

swagger:show: false
package com.xiaominfo.swagger.service.user.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.Order;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;@Configuration
@EnableSwagger2WebMvc
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfiguration {@Value("${swagger.show}")private boolean swaggerShow;@Bean(value = "userApi")@Order(value = 1)public Docket groupRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(groupApiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.xiaominfo.swagger.service.user.controller")).paths(swaggerShow == true ? PathSelectors.any() : PathSelectors.none()).build();}private ApiInfo groupApiInfo() {return new ApiInfoBuilder().title("swagger-bootstrap-ui很棒~~~!!!").description("<div style='font-size:14px;color:red;'>swagger-bootstrap-ui-demo RESTful APIs</div>").termsOfServiceUrl("http://www.group.com/").contact("group@qq.com").version("1.0").build();}
}

或者使用knife4j的增强特性

生产环境屏蔽资源

knife4j:# 开启增强配置enable: true# 开启生产环境屏蔽production: true

访问页面加权控制

knife4j:# 开启增强配置 enable: true# 开启Swagger的Basic认证功能,默认是falsebasic:enable: true# Basic认证用户名username: test# Basic认证密码password: 123

二、API文档自动生成

代码地址:https://gitee.com/xiaoym/swagger-bootstrap-ui-demo.git

整体项目结构如下:

|-knife4j-spring-cloud-gateway

|-----service-doc //文档聚合中心,是所有微服务文档的出口

|-----service-order //订单服务,包含所有与订单业务模块相关的接口

|-----service-server //eureka 注册中心

|-----service-user //用户服务,包含所有的用户接口

eureka注册中心

注册中心几乎没有代码,只是在pom.xml文件中引入了eureka服务的jar

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
项目的application.yml配置文件如下:
server:port: 10000
eureka:instance:hostname: localhostclient:register-with-eureka: falsefetch-registry: falseservice-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:application:name: knife4j-gateway-server

定义注册中心访问地址,端口号等属性

最后通过注解@EnableEurekaServer来启用注册中心

@EnableEurekaServer
@SpringBootApplication
public class ServiceServerApplication {

服务接口(订单order & 用户User)

由于服务接口订单和用户两个模块其实属性是差不多,只是接口不一样,因此就随便挑一个服务的配置来说吧

service-user:用户服务的接口

每个微服务只需要引入和swagger相关的后端jar包即可,不需要引入swagger的前端Ui,knife4j为我们提供了微服务项的starter,供开发者使用

当然,作为子服务,还需要引入eureka-clientjar,所以,pom.xml文件相关配置如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.6</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-micro-spring-boot-starter</artifactId></dependency>

项目的jar包引入完成后,接下来是配置swagger的相关配置,SwaggerConfiguration.java配置如下:

package com.xiaominfo.swagger.service.user.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.Order;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;@Configuration
@EnableSwagger2WebMvc
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfiguration {@Value("${swagger.show}")private boolean swaggerShow;@Bean(value = "userApi")@Order(value = 1)public Docket groupRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(groupApiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.xiaominfo.swagger.service.user.controller")).paths(swaggerShow == true ? PathSelectors.any() : PathSelectors.none()).build();}private ApiInfo groupApiInfo() {return new ApiInfoBuilder().title("swagger-bootstrap-ui很棒~~~!!!").description("<div style='font-size:14px;color:red;'>swagger-bootstrap-ui-demo RESTful APIs</div>").termsOfServiceUrl("http://www.group.com/").contact("group@qq.com").version("1.0").build();}
}

配置扫描目录包

通过@EnableSwagger2@EnableSwaggerBootstrapUi来开启swagger和增强特性

配置项目的application.yml文件,如下:

server:port: 10001servlet:context-path: /aub
spring:application:name: service-user
eureka:client:serviceUrl:defaultZone: http://localhost:10000/eureka/swagger:show: true

指定注册中心地址即可

最后,启用eureka客户端

@EnableEurekaClient
@SpringBootApplication
public class ServiceUserApplication {

当然,在服务的模块中还有和自己服务相关的业务接口(Controller代码),在这里就不列举了

订单模块(service-order)的代码配置和用户是类似的

文档聚合

有了eureka注册中心,服务模块的接口也已完成,最后一步是把我们所有的微服务都聚合到一个文档,统一输出到前端,供开发者调用了

pom引入相关jar包

service-doc也是一个eureka客户端,首先引入相关的jar,pom.xml配置文件如下:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId></dependency>

spring-cloud-starter-netflix-eureka-client:eureka客户端

spring-cloud-starter-gatewaygateway网关

knife4j-spring-boot-starterknife4j提供的前端ui和后端代码

另外,其实在文档这里,如果没有后端代码编写的话,仅仅引入一个swagger的前端ui模块也是可以的

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-ui</artifactId>
</dependency>

Application文件配置

配置我们的网关属性,路由规则等,application.yml配置文件如下:

server:port: 10003
spring:application:name: service-doccloud:gateway:discovery:locator:#          enabled: truelowerCaseServiceId: trueroutes:- id: service-useruri: lb://service-userpredicates:- Path=/user/aub/**#            - Header=Cookie,Set-Cookiefilters:#- SwaggerHeaderFilter- StripPrefix=1- id:  service-orderuri: lb://service-orderpredicates:- Path=/order/**filters:#- SwaggerHeaderFilter- StripPrefix=1eureka:client:serviceUrl:defaultZone: http://localhost:10000/eureka/logging:level:org.springframework:cloud.gateway: debug

文档聚合业务编码

在我们使用Spring Boot等单体架构集成swagger项目时,是通过对包路径进行业务分组,然后在前端进行不同模块的展示,而在微服务架构下,我们的一个服务就类似于原来我们写的一个业务组

springfox-swagger提供的分组接口是swagger-resource,返回的是分组接口名称、地址等信息

Spring Cloud微服务架构下,我们需要重写该接口,主要是通过网关的注册中心动态发现所有的微服务文档,代码如下:

public class SwaggerResourceConfig implements SwaggerResourcesProvider {private final RouteLocator routeLocator;private final GatewayProperties gatewayProperties;@Overridepublic List<SwaggerResource> get() {List<SwaggerResource> resources = new ArrayList<>();List<String> routes = new ArrayList<>();routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {route.getPredicates().stream().filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())).forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(),predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("**", "v2/api-docs"))));});return resources;}private SwaggerResource swaggerResource(String name, String location) {log.info("name:{},location:{}",name,location);SwaggerResource swaggerResource = new SwaggerResource();swaggerResource.setName(name);swaggerResource.setLocation(location);swaggerResource.setSwaggerVersion("2.0");return swaggerResource;}
}

接口:

@RestController
public class SwaggerHandler {@Autowired(required = false)private SecurityConfiguration securityConfiguration;@Autowired(required = false)private UiConfiguration uiConfiguration;private final SwaggerResourcesProvider swaggerResources;@Autowiredpublic SwaggerHandler(SwaggerResourcesProvider swaggerResources) {this.swaggerResources = swaggerResources;}@GetMapping("/swagger-resources/configuration/security")public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {return Mono.just(new ResponseEntity<>(Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));}@GetMapping("/swagger-resources/configuration/ui")public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {return Mono.just(new ResponseEntity<>(Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));}@GetMapping("/swagger-resources")public Mono<ResponseEntity> swaggerResources() {return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));}
}

启动配置

最后,项目启动类添加相关注解,代码如下:

@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class ServiceDocApplication {public static void main(String[] args) {SpringApplication.run(ServiceDocApplication.class, args);}}

文档展示

最后分别依次启动项目:

service-server

service-user

service-order

service-doc

打开文档地址:http://localhost:10003/doc.html

查看文档效果如下: 

三、API 开发规范

1、@Api 

@Api注解放在类上面,这里的value是没用的,tags表示该controller的介绍。

但是tags如果有多个值,会生成多个list

@Api(tags = "用户模块")
@RestController
@RequestMapping("/user")
public class UserController {

2、@ApiOperation

@ApiOperation注解用于放在方法上面,其中value是该类的简短的叙述,notes一般是该方法的详细描述。

@ApiOperation(value = "查询用户列表")@PostMapping(value = "/list")public Rest<List<User>> list(){

3、@ApiImplicitParams

@ApiImplicitParams:用在请求的方法上,包含一组参数说明

    @ApiImplicitParam:对单个参数的说明     

        name:参数名

        value:参数的汉字说明、解释

        required:参数是否必须传

        paramType:参数放在哪个地方

            · header --> 请求参数的获取:@RequestHeader

            · query --> 请求参数的获取:@RequestParam

            · path(用于restful接口)--> 请求参数的获取:@PathVariable

            · body(请求体)-->  @RequestBody User user

            · form(普通表单提交)    

        dataType:参数类型,默认String,其它值dataType="int"      

        defaultValue:参数的默认值

@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "用户ID", required = false, dataType = "String", paramType = "query", example = "1")})@ApiOperation(value = "根据用户id查询用户详情")@GetMapping("/queryById")public Rest<User> queryById(@RequestParam(value = "id") String id) {Rest<User> userRest = new Rest<>();userRest.setData(new User("user5", "总经理", "公司1"));return userRest;}

4、@ApiResponses

@ApiResponses:方法返回对象的说明

    @ApiResponse:每个参数的说明

        code:数字,例如400

        message:信息,例如"请求参数没填好"

        response:抛出异常的类

@ApiResponses(value = {@ApiResponse(code = 200, message = "接口返回成功状态"),@ApiResponse(code = 500, message = "接口返回未知错误,请联系开发人员调试")})@ApiOperation(value = "文件上传 测试接口", notes = "访问此接口,执行文件上传,测试接口")@PostMapping("upload")public void upload(@RequestParam("file") MultipartFile file) {}

5、@ApiModel

这里的Data Type Model,此时我们可以在实体类的代码中添加注解,选择我们需要在这里显示的属性。如下:

@ApiModelProperty(hidden = true)表示不需要在swagger页面进行展示,required表示该属性为必需的属性。

@ApiModel(value = "用户")
public class User {@ApiModelProperty(value = "姓名")private String name;@ApiModelProperty(value = "年龄")private Integer age;@ApiModelProperty(value = "工作")private String worker;@ApiModelProperty(value = "单位")private String company;

四、部署方式

1、前端打包成静态文件夹

dist文件夹下的内容拷贝到后端项目中resources/static目录下

2、前端页面放行

springsucurity的拦截器里面加上以下代码,放行这些静态文件

@Override

    public void configure(WebSecurity web) throws Exception {

        web.ignoring().antMatchers("/login","/css/**","/js/**","/index.html","/img/**","/fonts/**","/favicon.ico");

    }

3、使用maven的package打包项目

 

生成jar文件

 

4、把文件传到服务器主机

运行以下命令

nohup java -jar plms-0.0.1-SNAPSHOT.

 

5、在浏览器访问

http://服务器主机的ip:8080/index.html

五、在线测试

1、测试环境地址的配置管理

2、测试数据的模拟

Mock数据属性说明:

  1. 数据类型(MIME):响应结果类型,如JSONXML等;
  2. 结果数据:响应结果的数据,如响应结果类型为JSON时可设置响应结果数据为一段JSON数据;

 

六、授权

授权,是指授予某个APP调用某个API的权限。您的APP需要获得API的授权才能调用该API

七、监控

API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用。 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题。

1

八、统计

Dubbo-Monitor主要用来统计服务的调用次数和调用时间,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心,监控中心则使用数据绘制图表来显示

点击Statistics,成功的次数,失败的次数,平均花费的时间,最大花费的时间,并发的次数

点击Charts,可以看到请求和响应的图表


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

相关文章

API管理神器—Apipost

API管理神器—Apipost 1.背景 作为互联网工作者&#xff0c;只要是从事开发的&#xff0c;无论前端、后端、测试。 而一般完成整个接口的管理的解决方案如下&#xff1a; 使用 Swagger 管理 API 文档使用 Postman 调试 API使用 RAP等根据 Mock API 数据使用 JMeter 做 API 自…

功能强大的国产Api管理工具

前言 如果你是一名Java后端开发工程师&#xff0c;像Swagger、Postman、RAP这些工具&#xff0c;应该再熟悉不过了吧&#xff01;为我们的接口开发工作带来了很多的便捷&#xff0c;不过因为这些都是独立的框架&#xff0c;之间并不存在互通性&#xff0c;因此在多个框架间协调…

只用 6 分钟,让你弄明白什么是 API 及 API 管理

什么是 API API&#xff08;Application Programming Interface&#xff09;&#xff0c;指应用程序编程接口。 两个单独的应用程序需要中介程序才能相互通信。因此&#xff0c;开发人员经常需要搭建桥梁——也就是API&#xff0c;来允许一个系统访问另一个系统的信息或功能。A…

一文教你弄明白什么是 API 以及 API 管理

什么是 API API&#xff08;Application Programming Interface&#xff09;&#xff0c;指应用程序编程接口。 两个单独的应用程序需要中介程序才能相互通信。因此&#xff0c;开发人员经常需要搭建桥梁——也就是API&#xff0c;来允许一个系统访问另一个系统的信息或功能。A…

【API 管理】什么是 API 管理,为什么它很重要?

当今复杂的数字生态系统由许多相互关联的部分组成。API 作为看门人和连接器在其中发挥着关键作用——提供了许多最终用户甚至没有注意到的自动化机会和效率。 企业密切关注 API。它们对于应用程序、数据和各种客户交互的功能至关重要。 这使得 API 管理成为几乎每个部门的组织的…

API与API管理

什么是API API全称为应用程序编程接口&#xff0c;通俗来讲就是不需要访问程序的源代码&#xff0c;也不需要理解程序实现的方式&#xff0c;只需要通过访问相应接口的URL并填写需要获得的数据的参数名&#xff0c;来获取需要的参数信息。 一个接口可以是一个简单的应用程序&a…

API管理-架构-1-概要设计

API管理-架构-概要设计 前言API 为中心的架构REST API UnlessStreaming API 微服务与APIAPI分类API分层 API平台API安全一些必要点 Reference 前言 为了在企业中能够更好的支持Cloud, Mobile, Big Data&#xff0c;成功的关键在于能够 安全的&#xff0c; 可靠的&#xff0c;一…

Webssh、浏览器使用ssh连接服务器

python版本 python >2.7 效果图: 代码传送门: https://github.com/NiuXiangQian/webssh

webshell及工具

目录 一&#xff0c;Webshell的概念 二&#xff0c;eval函数的定义和用法 三&#xff0c;连接工具菜刀 3.1文件管理 3.2 虚拟终端 3.3 菜刀与burpsuite联动 四&#xff0c;哥斯拉的使用 五&#xff0c;冰蝎 六&#xff0c;webshell分类 七&#xff0c;webshell如何连接 …

web ssh

前言&#xff1a; 好久都没来写博客&#xff0c;最近忙啥去了呢&#xff1f; 一是忙于saltstack的二次开发&#xff0c;二是云计算的学习研究中&#xff0c;所以就一直没写东西&#xff0c;今天给大家介绍个工具。 好了&#xff0c;开始正文&#xff01; 1.首先来说一下为什么要…

Docker 配置WebSSH

1、基于DockerHub Centos镜像 docker pull centos:centos7 2、 Centos镜像存在的一个自身问题&#xff1a;启动后的容器内部无法使用systemctl命令 Failed to get D-Bus connection: Operation not permitted ## docker run -dit eeb6ee3f44bd /bin/bash ## 切勿忘记宿主机防…

什么是Webshell?

一、什么是Webshell&#xff1f; 顾名思义&#xff0c;“web”的含义是显然需要服务器开放web服务&#xff0c;“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。由于webshell其大多是以动态脚本的…

Flask框架:运用SocketIO实现WebSSH

Flask 框架中如果想要实现WebSocket功能有许多种方式&#xff0c;运用SocketIO库来实现无疑是最简单的一种方式&#xff0c;Flask中封装了一个flask_socketio库该库可以直接通过pip仓库安装&#xff0c;如下内容将重点简述SocketIO库在Flask框架中是如何被应用的&#xff0c;最…

网页终端直接操作linux系统【webssh】

1、安装pip linux系统默认都安装了python&#xff0c;但不一定安装了pip&#xff0c;所以先安装pip 我的系统中默认安装的是python2.7版本 curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py python get-pip.py 安装成功如图 2、安装webssh pip install w…

离线 安装webssh

1 安装包 和 webssh 代码准备 1 cmake 安装 安装参考文档: 文档地址 下载地址 $ tar xvfz cmake-3.24.2-linux-x86_64.tar.gz 配置环境全局变量 $ vim /etc/profile ​ # 添加 export PATH/root/webterminal/cmake-3.18.0-Linux-x86_64/bin:$PATH ​ $ source /etc/profil…

webshell是什么?

webshell是什么&#xff1f; 百度百科的定义&#xff1a;webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境&#xff0c;也可以将其称做为一种网页后门。黑客在入侵了一个网站后&#xff0c;通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文…

Docker 容器内体验 WebSSH

Docker容器内体验 WebSSH 项目地址: https://pypi.org/project/webssh/ 容器创建 docker run -tid --name centos -p 8888:8888 -p 122:22 centos:7 /bin/bash # 启动容器写个比较呆的shell脚本&#xff0c;方便安装 cat <<EOF > wssh.sh yum -y install epel-re…

golang实现WebSSH的功能

在最近一次需求里&#xff0c;需要实现一个webSSH的功能&#xff0c;就是把terminal搬到web中来。要实现这个功能&#xff0c;可以采用websocketssh来说实现 1.第一步实现websocket websocket主要是ws或wss协议&#xff0c;其原理就是http协议升级成ws协议&#xff0c;即ws是…

纯Java实现一个网页版的Xshell

前言 最近由于项目需求&#xff0c;项目中需要实现一个WebSSH连接终端的功能&#xff0c;由于自己第一次做这类型功能&#xff0c;所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用&#xff0c;当时看到了很多这方面的项目&#xff0c;例如&#xff1a;GateOne、webss…

webssh

vue djangolinux实现webssh 技术栈 xterm.js&#xff1a;做到vue的表现型 websocket&#xff1a; 做vue和django之间的通信 paramiko&#xff1a; 建立SSH连接通道 ssh&#xff1a; 与linux进行连接 threading&#xff1a;多条数据返回前端&#xff0c;io密集型&#xff0c;用…