【JAVA WEB實用與優化技巧】如何自己封裝一個自定義UI的Swagger組件,包含Swagger如何處理JWT無狀態鑒權自動TOKEN獲取

目錄

  • 一、Swagger 簡介
    • 1. 什么是 Swagger?
    • 2. 如何使用 Swagger
    • 3. Springboot 中swagger的使用示例
      • 1. maven 引入安裝
      • 2. java配置
  • 二、Swagger UI存在的缺點
    • 1.不夠方便直觀
    • 2.請求的參數沒有緩存
    • 3.不夠美觀
    • 4.如果是JWT 無狀態登錄,Swagger使用起來就沒有那么絲滑了
  • 三、封裝以及討論
    • 封裝組件
      • 代碼封裝
      • 解決無狀態登錄問題
        • 1. 我們往swagger-bootstrap-ui的右上角加一個按鈕,點擊出現彈框來配置自動獲取登錄token
        • 2.javascript 腳本部分實現:
  • 總結

一、Swagger 簡介

Swagger 是一款用于 API 設計、構建、文檔化和測試的開源工具。它提供了一整套的解決方案,幫助開發者更好地構建和管理 RESTful APIs。以下是對 Swagger 的簡要介紹:

1. 什么是 Swagger?

Swagger 是一個規范和完整的框架,用于生成、描述、調用和可視化 RESTful Web 服務。它基于 OpenAPI 規范(以前稱為 Swagger 規范),該規范定義了 API 的結構。

2. 如何使用 Swagger

  • 定義 API:使用 Swagger Editor 編寫 OpenAPI 規范文件,描述 API 的端點、請求參數、響應格式等。
  • 生成文檔:通過 Swagger UI 或 Swagger Codegen,生成可視化的 API 文檔。
  • 集成到項目:在項目中集成 Swagger 的相關工具,比如在 Spring Boot 項目中使用 springfox-swagger2springfox-swagger-ui 依賴,自動生成和托管 API 文檔。

3. Springboot 中swagger的使用示例

以下是一個使用 Swagger 注解的簡單示例,展示了如何在 Spring Boot 應用中集成 Swagger:

1. maven 引入安裝

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version>
</dependency>

2. java配置

@EnableSwagger2
@Configuration
public class SwaggerConfig {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.efficientnotes.boot.web")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("Efficient notes api platform").description("apis").termsOfServiceUrl("http://localhost:9000/").contact("yh4494@sina.com").version("1.0").build();}}

title title就是swagger頁面上展示的title,比如交ERP api平臺
description 詳情介紹
termsOfServiceUrl 機構首頁地址
contact 聯系方式
version 版本號

Spring security 排除攔截:

@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/swagger-ui.html").permitAll().antMatchers("/webjars/**").permitAll().antMatchers("/swagger-resources/**").permitAll().antMatchers("/v2/*").permitAll().antMatchers("/csrf").permitAll().antMatchers("/").permitAll().anyRequest().authenticated().and().formLogin();}
}

控制器示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;@RestController
@Api(value = "示例API", description = "這是一個示例API")
public class ExampleController {@GetMapping("/hello")@ApiOperation(value = "問候接口", notes = "通過傳遞名字來獲得問候語")public String hello(@ApiParam(value = "用戶的名字", required = true) @RequestParam String name) {return "Hello, " + name + "!";}
}

在完成上述步驟后,啟動 Spring Boot 應用并訪問 http://localhost:8080/swagger-ui.html,即可查看自動生成的 API 文檔。
Swagger 是一個強大且靈活的工具集,為開發者提供了方便、高效的 API 管理解決方案。通過標準化和自動化,它極大地簡化了 API 開發和維護的過程。

在這里插入圖片描述
圖 ①

二、Swagger UI存在的缺點

1.不夠方便直觀

swagger ui 布局是上下瀑布式的,比如我訪問完A接口,想訪問B接口,訪問完B接口想繼續訪問A接口就必須往上翻,接口少還好操作。接口多的話來回就很煩。

2.請求的參數沒有緩存

比如我想掉一個post接口來偽造一條數據,第一次訪問完成之后,刷新頁面后第二次還要重新造數據,就很麻煩,命名我只需要改部分字段重新請求就行,結果每次都要重新填寫報文。字段躲起來兼職就是折磨。

3.不夠美觀

不用多說,當然一個工具類產品美觀并不重要,但是美觀的產品還是能給人帶來心情愉悅的體驗,就像你旁邊坐著一位漂亮女孩,你整天心情都會好很多。不管如何對我來說工具顏值還是挺重要的。

4.如果是JWT 無狀態登錄,Swagger使用起來就沒有那么絲滑了

因為JWT無狀態登錄這種需要每次在請求的Header中帶上TOKEN,Swagger可沒那么只能給你登錄接口返回的token帶過去,這樣就導致無狀態session的情況下Swagger的調試功能等于癱瘓狀態。

三、封裝以及討論

我們來討論下如何解決上述一些缺陷給Swagger換一層皮,并且將Swagger封裝成組件

很久以前我就關注過一些swaggerui的項目了,比較優秀的是swagger-bootstrap-ui。現在好像升級過不叫這個名字了,但我保存了一份之前的swagger-bootstrap-ui的代碼。github的地址是:https://github.com/xiaoymin/swagger-bootstrap-ui,直接可以下載的地址: swagger-bootstrap-ui。

這份UI解決了上述中前三個問題不夠方便直觀、請求的參數沒有緩存、不夠美觀,雖然不是太好看,但也還好吧!如果對外觀還是不夠滿意的話可以自己修改下樣式,蓋起來也很方便,我會在下面的文章中進行討論和介紹。那么我們先看下具體的ui長什么樣子。
在這里插入圖片描述
圖②

看起來是不是比圖 ①要舒服多了。那么我們在下面異步異步的討論如何將這個ui封裝成一個組件可以直接引用以及如何解決缺陷的第四點:JWT無狀態登錄如何自動拼裝token。

封裝組件

現在我們有了前端代碼,可以參考swagger原生的ui就是做成的一個jar包,引入的這個jar包就擁有了swagger-ui。我們也參考下這種方式,前后端代碼結合自動配置,項目引入我們的依賴就能直接擁有提供接口文檔的能力。

代碼封裝

我們想讓我們的組件提供完整的swagger能力,那么首先我們自己的封裝的swagger組件中要引入所有的swagger的依賴。

<dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version><exclusions><exclusion><artifactId>spring-context</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>spring-aop</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>jackson-annotations</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion><exclusion><artifactId>spring-beans</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>

swagger2是通過EnableSwagger2來啟用swagger,我們也可以寫一個注解來做這件事情,引用我們自己定義的注解就可以自動配置啟用我們的swagger組件。

EnableAllensSwagger

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(SwaggerConfig.class)
public @interface EnableAllensSwagger {
}

然后我們需要將所有的配置都配置好,提供我們自己自定義的配置出去,然需要引入的應用項目配置我們提供的配置來自定義Swagger。

SwaggerProperties

/*** SwaggerProperties** @author allens* @since 2024/5/21*/
@Component
@ConfigurationProperties(prefix = "allens.swagger")
@Setter
@Getter
public class SwaggerProperties {private String packages;private String title;private String description;private String termsOfServiceUrl;private String version;private String contact;
}

SwaggerConfig 通過這個類來做組件的autoconfig,當Springboot中啟用@EnableAllensSwagger注解的時候,@Import(SwaggerConfig.class)就會自動加載注入 SwaggerConfig,SwaggerConfig回去掃描com.allens.swagger下的所有bean來自動加載組件。

@EnableSwagger2
@Configuration
@ComponentScan("com.allens.swagger")
@EnableConfigurationProperties(SwaggerProperties.class)
public class SwaggerConfig {@ResourceSwaggerProperties swaggerProperties;@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage(swaggerProperties.getPackages())).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title(swaggerProperties.getTitle()).description(swaggerProperties.getDescription()).termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl()).contact(swaggerProperties.getContact()).version(swaggerProperties.getVersion()).build();}}

接著我們需要把前端的代碼copy到項目中,同時項目打包的時候可以把swagger-bootstrap-ui打包到jar包中,同時我們需要訪問/${servletContextPath}/doc.html的時候可以正常訪問到前端界面。

① 拷貝swagger-boot-ui 到項目中
在這里插入圖片描述

② 配置路由映射規則,如果是SpringSecurity也是要忽略doc.html//webjars/**這兩個地址。

@Configuration
public class SwaggerWebMvcConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("doc.html").addResourceLocations("classpath:/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/resources/webjars/");}
}
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().and().csrf().disable().exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers(" "/doc.html","/webjars/**","/v2/api-docs/**","/swagger-resources/**").anonymous().anyRequest().authenticated();http.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);// 添加CORS filterhttp.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);http.addFilterBefore(corsFilter, LogoutFilter.class);
}

然后我們就可以直接到項目中引入我們的組件并且配置了

<dependency><groupId>com.efficientnotes</groupId><artifactId>allens-swagger</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

yml文件配置:

allens:swagger:packages: com.efficientnotes.boot.webtitle: Efficient notes api platformdescription: apistermsOfServiceUrl: http://localhost:9000/version: 1.0contact: allens@sina.com

啟動服務并訪問: http://localhost:9000/${servletContextPath}/doc.html
在這里插入圖片描述

解決無狀態登錄問題

如果說你的項目是Session模式的方案,那么到這里就結束了。但假如說你是無狀態登錄的方案,那么就要繼續往下看了。無狀態登錄我們需要把token塞進header中進行請求,那么我們就需要攔截截取登錄接口的報文中的token。而且每次請求的時候都要把header中的token拼接上去。

注意只有無狀態JWT模式才需要這樣做!!!

1. 我們往swagger-bootstrap-ui的右上角加一個按鈕,點擊出現彈框來配置自動獲取登錄token

在這里插入圖片描述
點擊之后是一個彈窗,這個彈窗會要求輸入登錄接口路徑、登錄token提取路徑以及Token名稱。如果走自動獲取HeaderJSON是不需要填的。如果想手動塞Header,那么可以使用JSON格式塞TOKEN塞進行去,這種方式不需要配置登錄接口路徑和登錄token提取路徑以及token名稱。

  • 登錄接口路徑 你系統的登錄接口路徑
  • 登錄接口提取路徑 json path,比如登錄接口返回的是{“data”: {token: “xxx”, “other”: “ok”},“msg”: “”},那么登錄接口提取路徑為:data.token
  • TOKEN名稱 接口請求需要攜帶的Header Token名稱
  • Header JSON 有兩種情況,如果不填上述三個配置,header JSON就可以手動設置,設置完成之后,每次請求都會自動攜帶你配置的Header上去。如果配置了上述三個配置,那么每次自動獲取完登錄的TOKEN之后會自動帶出來。

在這里插入圖片描述
來看看代碼怎么實現的:
doc.html

<div class="sbu-header-right" style="margin-top:12px"><div class="col-sm-6"><button style="background: #0d5aa7" onclick="showPromoteDefaultHeader()" type="button" class="btn btn-info">通用頭設置</button></div>
</div>
2.javascript 腳本部分實現:
function showPromoteDefaultHeader() {var test = layer.open({type: 1, // page 層類型area: ['700px', '500px'],title: '配置頭信息',shade: 0.6, // 遮罩透明度shadeClose: true, // 點擊遮罩區域,關閉彈層maxmin: true, // 允許全屏最小化anim: 0, // 0-6 的動畫形式,-1 不開啟content:`<div class="allens-dialog"><div class="element"><span>登錄接口路徑</span><input id="allens-dialog-login-interface-name" name="loginInterfaceName" /></div><div class="element"><span>登錄token提取路徑</span><input id="allens-dialog-json-path" name="jsonPath" /></div><div class="element"><span>TOKEN名稱</span><input id="allens-dialog-token-name" name="tokenName" /></div><div class="element"><span>Header JSON</span><textarea id="allens-dialog-header-json" style="width: 100%;" cols="10" rows="8" name="" id=""></textarea></div><button class="btn btn-primary btn-lg" id="allens-dialog-submit">提交</button></div>`});function notEmpty (variable) {if (variable === null || variable === undefined || variable === '') {// 變量為空return false;}return true;}var button = document.querySelector('#layui-layer' + test + ' #allens-dialog-submit');var loginInterFaceName = document.querySelector('#layui-layer' + test + ' #allens-dialog-login-interface-name');var jsonPath = document.querySelector('#layui-layer' + test + ' #allens-dialog-json-path');var headerJson = document.querySelector('#layui-layer' + test + ' #allens-dialog-header-json');var tokenName = document.querySelector('#layui-layer' + test + ' #allens-dialog-token-name');button.onclick = () => {if (notEmpty(loginInterFaceName)) {localStorage.setItem('LOGININTERFACENAME', loginInterFaceName.value)}if (notEmpty(jsonPath)) {localStorage.setItem('JSONPATH', jsonPath.value)}if (notEmpty(headerJson)) {localStorage.setItem('HEADERJSON', headerJson.value)}if (notEmpty(tokenName)) {localStorage.setItem('TOKENNAME', tokenName.value)}layer.close(test);}// text.setAttribute('placeholder', '格式為JSON:{"headerName": "headerValue"}')var data = localStorage.getItem('HEADERJSON');if (data) {const jsonObject = JSON.parse(data);const jsonString = JSON.stringify(jsonObject, null, 2);headerJson.value = jsonString;}loginInterFaceName.value = localStorage.getItem('LOGININTERFACENAME')jsonPath.value = localStorage.getItem('JSONPATH')tokenName.value = localStorage.getItem('TOKENNAME')
}

可以下載下源碼看下具體的實現,暫時只支持CSDN下載,后續我會傳到github。https://download.csdn.net/download/yh4494/89335880

總結

至此我們討論的四個swagger的缺點就全部解決了,當然你也可以自己去修改樣式,源碼都有的怎么該都可以,只要不要有大的bug就行。甚至可以上傳到中央倉庫給大家使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19328.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STL-stack的使用及其模擬實現

在C標準庫中&#xff0c;stack是一種容器適配器&#xff0c;它以后進先出的方式組織數據&#xff0c;其刪除只能從容器的棧頂進行元素的插入與取出操作。 stack的使用 stack的構造函數 stack的成員函數 empty&#xff1a;判斷棧是否為空back&#xff1a;返回當前棧中元素的數量…

docker之自制django鏡像

一&#xff0c;安裝docker&#xff08;本作者往期文章有docker安裝 &#xff0c;或者更詳細的有關docker安裝&#xff09; 二&#xff0c;拉取centos7鏡像 docker pull centos:7 三&#xff0c;創建容器 docker run -id -v /root/docker/soft:/soft -p 8000:8000 --name djang…

Redis實踐記錄與總結

最近生產環境緩存數據庫數據過大&#xff08;如何搭建單服務redis緩存數據庫&#xff1f;以及可視化工具Another Redis Desktop Manager使用&#xff09;&#xff0c;導致在對數據庫做rdb快照備份時消耗內存過大&#xff0c;緩存數據庫宕機一小時。基礎運維通過增加虛擬機內存暫…

spark相關知識

1.Spark的特點 Spark的設計遵循“一個軟件棧滿足不同應用場景”的理念&#xff0c;逐漸形成了一套完整的生態系統&#xff0c;既能夠提供內存計算框架&#xff0c;也可以支持SQL即席查詢、實時流式計算、機器學習和圖計算等。 運行速度快&#xff0c;易使用&#xff0c;強大的技…

kube-prometheus-stack 識別 k8s 集群內所有的 ServiceMonitor 和 PrometheusRule

默認情況下&#xff0c;kube-prometheus-stack 只自己創建的 ServiceMonitor&#xff0c;如果 k8s 集群內有多個非 kube-prometheus-stack 創建的 ServiceMonitor&#xff0c;不會被識別到。PrometheusRule 同理。 要識別所有的 ServiceMonitor 和 PrometheusRule &#xff0c;…

推薦一個 Java 開源企業級新能源汽車智能共享充電樁管理平臺

文末可獲取 Orise 平臺源碼 01 Orise 智能充電樁管理平臺 奧升( Orise ) 新能源汽車充電樁管理 Saas 云平臺是一個集充電設備管理、用戶充電管理、線上小程序內容管理于一體的綜合管理平臺。Orise充電樁平臺支持高并發業務、業務動態伸縮、樁通信負載均衡&#xff0c;通過Docke…

關于 kubernetes 的9個核心問題解答

本文通過提問題的方式對在 Kubernetes 集群建設中&#xff0c;不同的網絡組件、存儲方案、CI/CD工具、監控系統、網關服務以及服務網格&#xff08;如 Istio&#xff09;等選擇給出一定的參考解答&#xff1b;但在實際工作中需要緊密結合業務規模、系統性能需求、安全性要求以及…

Golang項目代碼組織架構實踐

Golang在項目結構上沒有強制性規范&#xff0c;雖然這給了開發者很大的自由度&#xff0c;但也需要自己沉淀一套可行的架構。本文介紹了一種項目布局&#xff0c;可以以此為參考設計適合自己的 Golang 項目組織模式。原文: Golang Project Layout Go 有很多強制的或是約定俗成的…

收藏:六款好用的企業防泄密軟件推薦

企業數據如同企業的生命線&#xff0c;保護數據安全免遭泄露變得至關重要。 面對日益復雜的網絡安全威脅&#xff0c;一套高效的企業防泄密軟件成為企業安全架構的基石。 以下是精心挑選的六款企業防泄密軟件&#xff0c;它們在數據加密、訪問控制、行為監控等方面表現出色&am…

lua vm 常識一: attempt to yield across a C-call boundary 的原因分析

使用 lua 的時候有時候會遇到這樣的報錯&#xff1a;“attempt to yield across a C-call boundary”。 1. 網絡上的解釋 可以在網上找到一些關于這個問題的解釋。 1.1 解釋一 這個 issue&#xff1a;一個關于 yield across a C-call boundary 的問題&#xff0c;云風的解釋是…

輪廓系數(Average silhouette) | 最佳聚類數的判定

1.最佳分類個數 # 輔助確定最佳聚類數 4.7*2.6 factoextra::fviz_nbclust( t(DPAU_2), kmeans, method "silhouette")在2有下降拐點&#xff0c;但是樣本較多時分成2類一般意義不大。 在7時也有下降拐點。 2.查看每個分類的輪廓系數 (1) pam k5 library(cluste…

【Paddle】Inplace相關問題:反向傳播、影響內存使用和性能

【Paddle】Inplace相關問題&#xff1a;反向傳播、影響內存使用和性能 寫在最前面inplace 的好處有哪些&#xff1f;能降低計算復雜度嗎在反向傳播時&#xff0c;Inplace為什么會阻礙呢&#xff1f;“計算圖的完整性受損”表達有誤原地操作 sin_()為什么原地操作會阻礙反向傳播…

活動會議邀請函制作易企秀源碼系統 清爽的畫面輕輕滑動自動翻頁 帶完整的前后端搭建教程

系統概述 在當今數字化時代&#xff0c;活動會議的組織和宣傳變得至關重要。為了滿足這一需求&#xff0c;活動會議邀請函制作易企秀源碼系統應運而生。它不僅為用戶提供了一個便捷、高效的工具&#xff0c;還具備一系列令人矚目的特色功能&#xff0c;為活動會議的成功舉辦提…

Ubuntu22.04設置程序崩潰產生Core文件

Ubuntu22.04設置程序崩潰產生Core文件 文章目錄 Ubuntu22.04設置程序崩潰產生Core文件摘要Ubuntu 生成Core文件配置1. 檢查 core 文件大小限制2. 設置 core 文件大小限制3. 配置 core 文件命名和存儲路徑4. 重啟系統或重新加載配置5. 測試配置 關鍵字&#xff1a; Ubuntu、 C…

Dubbo底層RPC原理深度解析

Dubbo作為一款高性能的分布式服務框架&#xff0c;其核心在于其底層的RPC實現&#xff0c;它允許服務在分布式系統中的不同節點間透明地進行遠程調用。以下是Dubbo底層RPC原理的詳細介紹&#xff1a; 基本概念 RPC&#xff08;Remote Procedure Call&#xff09;是一種編程模型…

CSS浮動詳細教學(CSS從入門到精通學習第四天)

css第04天 一、其他樣式 1、圓角邊框 在 CSS3 中&#xff0c;新增了圓角邊框樣式&#xff0c;這樣我們的盒子就可以變圓角了。 border-radius 屬性用于設置元素的外邊框圓角。 語法&#xff1a; border-radius:length; 參數值可以為數值或百分比的形式如果是正方形&…

js 如何封裝一個iframe通訊的sdk

在JavaScript中&#xff0c;封裝一個用于iframe間通信的SDK&#xff0c;可以利用postMessage和message事件監聽來實現跨域通信。以下是一個簡單的示例&#xff0c;展示如何封裝這樣一個SDK&#xff1a; 步驟 1: 創建SDK文件 首先&#xff0c;創建一個名為IframeCommunicator.…

RTT UART設備框架學習

UART簡介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通用異步收發傳輸器&#xff0c;UART 作為異步串口通信協議的一種&#xff0c;工作原理是將傳輸數據的每個字符一位接一位地傳輸。是在應用程序開發過程中使用頻率最高的數據總線。 UART串…

MySQL注入 — Dns 注入

DNS注入原理 通過子查詢&#xff0c;將內容拼接到域名內&#xff0c;讓load_file()去訪問共享文件&#xff0c;訪問的域名被記錄此時變為顯錯注入,將盲注變顯錯注入,讀取遠程共享文件&#xff0c;通過拼接出函數做查詢,拼接到域名中&#xff0c;訪問時將訪問服務器&#xff0c;…

CISP難度將加大?還考不考啊...

最新消息&#xff1a;CISP即將調整知識體系大綱&#xff0c;更新題庫&#xff0c;后續考試難度加大。 最近幾年&#xff0c;CISP改版地比較頻繁&#xff0c;難度也在不斷上升&#xff0c;因此各位小伙伴有考CISP想法的盡早考。 隨著《網絡安全法》、《網絡空間安全戰略》、《…