当前位置:首页 > 数码 > 6-Spring-提供的四种弱小工具-远程接口调用神器 (6sp日常使用还能用多久)

6-Spring-提供的四种弱小工具-远程接口调用神器 (6sp日常使用还能用多久)

admin5个月前 (04-15)数码33

1.引见

Spring6是一个十分弱小的框架,它提供了许多工具和接口来简化远程接口调用。其中,WebClient、RestTemplate、HTTPInterface和RestClient是四种形式。

WebClient是Spring5中新引入的一个接口基于照应式,它提供了一种更繁难、更灵敏的形式来调用远程接口。与RestTemplate相比,WebClient愈加现代化,具有更好的性能和更低的内存占用。

RestTemplate是Spring3中引入的一个接口,它提供了一种愈加繁难、愈加直观的形式来调用远程接口。只管WebClient是更现代化的选用,但RestTemplate依然是一种罕用的远程接口调用形式。

HTTPInterface将HTTP服务定义为一个接口,其中蕴含用于HTTP替换的注解方法。而后,你可以生成一个成功该接口并口头替换的代理。这有助于简化HTTP远程访问,由于远程访问通常须要经常使用一个门面来封装经常使用底层HTTP客户端的细节。

RestClient是一个同步HTTP客户端,提供现代、流利的API。它为HTTP库提供了一个形象,可以繁难地从Java对象转换为HTTP恳求,并从HTTP照应创立对象。

上方区分引见4个REST接口调用的具体经常使用。

2.远程接口调用

RestTemplate

RestTemplate提供了比HTTP客户端库更初级别的API。它使调用REST端点变得繁难易行。它地下了以下几组重载方法:

方法

形容

getForObject

经过GET检索数据。

getForEntity

经常使用GET失掉照应实体(即形态、标头和注释)。

headForHeaders

经常使用HEAD读取资源的一切标头。

postForLocation

经常使用POST创立新资源,并从照应中前往位置标头。

postForObject

经常使用POST创立一个新资源,并从照应中前往形容。

postForEntity

经常使用POST创立一个新资源,并从照应中前往形容。

经常使用PUT创立或升级资源。

patchForObject

经常使用PATCH升级资源,并前往照应中的形容。请留意,JDKHttpURLConnection不支持PATCH,但HttpComponents和其余组件支持。

经常使用DELETE删除指定URI上的资源。

optionsForAllow

6sp日常使用还能用多久

经过ALLOW读取资源准许经常使用的HTTP方法。

前述方法的更通用(更少意见)版本,可在须要时提供额外的灵敏性。它接受一个RequestEntity(包括作为输入的HTTP方法、URL、题目和注释),并前往一个ResponseEntity。

这些方法准许经常使用参数化类型援用(ParameterizedTypeReference)而不是类(Class)来指定具有泛型的照应类型。

口头恳求的最通用形式,可经过回调接口齐全控制恳求预备和照应提取。

自动结构函数经常使用java.HttpURLConnection来口头恳求。你可以经过ClientHttpRequestFactory的成功切换到不同的HTTP库。目前,该程序还内置了对ApacheHttpComponents和OkHttp的支持。示例:

RestTemplatetemplate=newRestTemplate(newHttpComponentsClientHttpRequestFactory());

每个ClientHttpRequestFactory都会地下底层HTTP客户端库的特定性能选项,例如,凭证、衔接池和其余细节。

许多RestTemplate方法都接受URI模板和URI模板变量,可以是字符串变量参数,也可以是Map<String,String>。

Stringresult=restTemplate.getForObject("http://pack.com/users/{userId}",String.class,666);

Map<String,?>形式:

Map<String,Object>params=Collections.singletonMap("userId",666);Stringresult=restTemplate.getForObject("http://pack.com/users/{userId}",String.class,params);

可以经常使用exchange()方法指定恳求头,如下例所示:

StringuriTemplate="http://pack.com/users/{userId}";URIuri=UriComponentsBuilder.fromUriString(uriTemplate).build(42);RequestEntity<Void>requestEntity=RequestEntity.get(uri).header("x-api-token","aabbcc").build();ResponseEntity<String>response=template.exchange(requestEntity,String.class);StringresponseHeader=response.getHeaders().getFirst("x-version");Stringbody=response.getBody();

假设你以后CLASSPATH存在MingJackson2HttpMessageConverter,那么你可以间接将恳求结果映射为你所须要的结果对象,如下示例所示,将指标接口前往值间接转换为User对象。

Useruser=restTemplate.getForObject("http://pack.com/users/{userId}",User.class,666);

自动状况下,RestTemplate会注册一切内置的信息转换器,这选择于你以后类门路能否有相应的转换库。你也可以显式设置要经常使用的信息转换器。自动结构函数如下:

publicRestTemplate(){this.messageConverters.add(newByteArrayHttpMessageConverter());this.messageConverters.add(newStringHttpMessageConverter());this.messageConverters.add(newResourceHttpMessageConverter(false));//...其它转换器if(jackson2Present){this.messageConverters.add(newMappingJackson2HttpMessageConverter());}elseif(gsonPresent){this.messageConverters.add(newGsonHttpMessageConverter());}elseif(jsonbPresent){this.messageConverters.add(newJsonbHttpMessageConverter());}//...其它转换器this.uriTemplateHandler=initUriTemplateHandler();}

留意:RestTemplate目前处于保养形式,只接受小改变和失误恳求。请思考改用WebClient。

WebClient是口头HTTP恳求的非阻塞、反响式客户端。它在5.0中引入,提供了RestTemplate的代替打算,支持同步、异步和流场景。

WebClient支持以下性能:

示例:

Mono<Person>result=client.get().uri("/users/{userId}",id).accept(MediaType.APPLICATION_JSON).retrieve().bodyToMono(User.class);

HTTPInterface

SpringFramework可让你将HTTP服务定义为一个Java接口,其中蕴含用于HTTP替换的注解方法。而后,你可以生成一个成功该接口并口头替换的代理。这有助于简化HTTP远程访问,由于远程访问通常须要经常使用一个门面来封装经常使用底层HTTP客户端的细节。

首先,申明一个带有@HttpExchange方法的接口:

@HttpExchange(url="/demos")publicinterfaceDemoInterface{@PostExchange("/format3/{id}")UsersqueryUser(@PathVariableLongid);}

创立一个代理,口头所申明的HTTPexchanges:

@ServicepublicclassDemoService{privatefinalDemoInterfacedemoInterface;publicDemoService(){//基于照应式调用;你以后的环境须要引入webfluxWebClientclient=WebClient.builder().baseUrl("http://localhost:8088/").build();HttpServiceProxyFactoryfactory=HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();this.demoInterface=factory.createClient(DemoInterface.class);}publicUsersqueryUser(Longid){returnthis.demoInterface.queryUser(id);}}

测试接口

@ResourceprivateDemoServicedemoService;@GetMapping("/{id}")publicUsersgetUser(@PathVariable("id")Longid){returnthis.demoService.queryUser(id);}

口头结果

图片

支持的方法参数

方法参数

说明

灵活设置恳求的URL,笼罩注解的url属性。

HttpMethod

灵活设置恳求的HTTP方法,笼罩注解的方法属性

@RequestHeader

参与一个或多个恳求标头。参数可以是蕴含多个标头的Map<String,?>或MultiValueMap<String,?>、值汇合<?>或单个值。

@PathVariable

参与一个变量,用于裁减恳求URL中的占位符。参数可以是蕴含多个变量的Map<String,?>或单个值。

@RequestBody

提供恳求的注释,既可以是要序列化的对象,也可以是ReactiveStreamsPublisher(如Mono、Flux或经过性能的ReactiveAdapterRegistry支持的任何其余异步类型)。

@RequestParam

参与一个或多个恳求参数。参数可以是蕴含多个参数的Map<String,?>或MultiValueMap<String,?>、数值汇合<?>或单个数值。

当"content-type"设置为"application/x-www-form-urlencoded"时,恳求参数将在恳求注释中编码。否则,它们将作为URL查问参数参与。

@RequestPart

参与一个恳求局部,它可以是字符串(表单字段)、资源(文件局部)、对象(要编码的实体,如JSON)、HttpEntity(局部内容和标头)、Spring局部或上述任何局部的ReactiveStreams颁布器。

@CookieValue

参与一个或多个cookie。参数可以是蕴含多个cookie的Map<String,?>或MultiValueMap<String,?>、值汇合<?>或单个值。

支持的前往值

前往值

说明

口头给定的恳求,并颁布照应内容(假设有)。

HttpHeaders ,

口头给定的恳求,监禁照应内容(假设有),并前往照应标头。

口头给定的恳求,并依据申明的前往类型对照应内容启动解码。

口头给定的恳求,并将照应内容解码为已申明元素类型的数据流。

ResponseEntity<Void> ,

口头给定的恳求,监禁照应内容(假设有),并前往一个蕴含形态和标头的ResponseEntity。

ResponseEntity<T> ,

口头给定的恳求,依照申明的前往类型解码照应内容,并前往一个蕴含形态、标头和解码后注释的ResponseEntity。

口头给定的恳求,将照应内容解码为已申明元素类型的数据流,并前往一个蕴含形态、标头和解码后的照应注释数据流的ResponseEntity。

意外处置

自动状况下,WebClient为4xx和5xxHTTP形态代码引发WebClientResponseException。要自定义此项,可以注册照应形态处置程序,该处置程序运行于经过客户端口头的一切照应:

WebClientclient=WebClient.builder()//形态码为4xx或5xx.defaultStatusHandler(HttpStatusCode::isError,resp->Mono.just(newRuntimeException(resp.statusCode().toString()+"恳求失误"))).baseUrl("http://localhost:8088/").build();HttpServiceProxyFactoryfactory=HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();

RestClient

该接口是在Spring6.1.1版本中才有的,是一个同步HTTP客户端,提供现代、流利的API。

创立RestClientRestClient是经过静态创立方法之一创立的。你还可以经常使用builder失掉带有更多选项的生成器,例如指定要经常使用的HTTP库和要经常使用的信息转换器,设置自动URI、自动门路变量、自动恳求头,或注册阻拦器和初始化器。

创立(或构建)后,RestClient可由多个线程安保经常使用。

//自动经过静态方法创立RestClientrestClient=RestClient.create();//自定义形式RestClientrestClient=RestClient.builder().requestFactory(newHttpComponentsClientHttpRequestFactory())//自定义信息转换器//.messageConverters(converters->converters.add(newPackCustomMessageConverter())).baseUrl("http://localhost:8088").defaultUriVariables(Map.of("id","888")).defaultHeader("x-api-token","aabbcc").requestInterceptor(newClientHttpRequestInterceptor(){@OverridepublicClientHttpResponseintercept(HttpRequestrequest,byte[]body,ClientHttpRequestExecutionexecution)throwsIOException{System.out.println("我是阻拦器");returnexecution.execute(request,body);}}).requestInitializer(newClientHttpRequestInitializer(){@Overridepublicvoidinitialize(ClientHttpRequestrequest){System.out.println("我是初始化器");request.getHeaders().add("x-version","1.0.0");}}).build();

调用及处置前往值

Usersusers=customClient.get().uri("/demos/users/{id}").retrieve().body(Users.class);

post+body恳求形式

Usersuser=newUsers();ResponseEntity<Void>response=restClient.post().uri("/demos/users").contentType(APPLICATION_JSON).body(user).retrieve().toBodilessEntity();

失误处置自动状况下,以后往形态代码为4xx或5xx的照应时,RestClient会抛出RestClientException的子类。可以经常使用onStatus.RestClientException命令重写该行为。

Usersusers=customClient.get().uri("/demos/users/{id}").retrieve()//处置前往形态码为:4xx和5xx.onStatus(HttpStatusCode::isError,(request,response)->{thrownewRuntimeException(response.getStatusCode().toString()+"恳求失误");}).body(Users.class);

总结:成功远程接口调用方面的弱小性能。无论是经常使用WebClient、RestTemplate、HTTPInterface还是间接经常使用RestClient,Spring都提供了丰盛的工具和接口来简化开发者的操作。这些工具和接口不只具有高性能、低内存占用的好处,而且提供了良好的可裁减性和灵敏性,使得开发者可以依据实践需求启动定制化开发。


单点登录JWT与Spring Security OAuth

通过 JWT 配合 Spring Security OAuth2 使用的方式,可以避免 每次请求都 远程调度认证授权服务。 资源服务器只需要从 授权服务器验证一次,返回 JWT。返回的 JWT 包含了 用户的所有信息,包括 权限信息 。

1. 什么是JWT

JSON Web Token(JWT)是一种开放的标准(RFC 7519),JWT 定义了一种 紧凑且 自包含的标准,旨在将各个主体的信息包装为 JSON 对象。 主体信息是通过 数字签名进行 加密和 验证的。经常使用 HMAC 算法或 RSA( 公钥 / 私钥的 非对称性加密 )算法对 JWT 进行签名, 安全性很高 。

2. JWT的结构

JWT 的结构由三部分组成:Header(头)、Payload(有效负荷)和 Signature(签名)。因此 JWT 通常的格式是 。

2.1. Header

Header 通常是由 两部分组成:令牌的 类型 (即 JWT)和使用的 算法类型 ,如 HMAC、SHA256 和 RSA。例如:

将 Header 用 Base64 编码作为 JWT 的 第一部分 ,不建议在 JWT 的 Header 中放置 敏感信息 。

2.2. Payload

下面是 Payload 部分的一个示例:

将 Payload 用 Base64 编码作为 JWT 的 第二部分 ,不建议在 JWT 的 Payload 中放置 敏感信息 。

2.3. Signature

要创建签名部分,需要利用 秘钥对 Base64 编码后的 Header 和 Payload 进行 加密 ,加密算法的公式如下:

签名可以用于验证 消息在 传递过程中有没有被更改。对于使用 私钥签名的 token,它还可以验证 JWT 的 发送方是否为它所称的 发送方 。

3. JWT的工作方式

客户端获取 JWT 后,对于以后的 每次请求 ,都不需要再通过 授权服务来判断该请求的 用户以及该 用户的权限 。在微服务系统中,可以利用 JWT 实现 单点登录 。认证流程图如下:

4. 案例工程结构

工程原理示意图如下:

5. 构建auth-service授权服务

jks 文件的生成需要使用 Java keytool 工具,保证 Java 环境变量没问题,输入命令如下:

其中,-alias 选项为 别名 ,-keyalg 为 加密算法 ,-keypass 和 -storepass 为 密码选项 ,-keystore 为 jks 的 文件名称 ,-validity 为配置 jks 文件 过期时间 (单位:天)。

生成的 jks 文件作为 私钥 ,只允许 授权服务所持有,用作 加密生成JWT。把生成的 jks 文件放到 auth-service 模块的 src/main/resource 目录下即可。

对于 user-service 这样的 资源服务 ,需要使用 jks 的 公钥对 JWT 进行 解密 。获取 jks 文件的 公钥的命令如下:

这个命令要求安装 openSSL 下载地址,然后手动把安装的 所在目录配置到 环境变量 。

输入密码 fzp123 后,显示的信息很多,只需要提取 PUBLIC KEY,即如下所示:

新建一个 文件,将上面的 公钥信息复制到 文件中并保存。并将文件放到 user-service 等 资源服务的 src/main/resources 目录下。至此 auth-service 搭建完毕。

maven 在项目编译时,可能会将 jks 文件 编译 ,导致 jks 文件 乱码 ,最后不可用。需要在 文件中添加以下内容:

6. 构建user-service资源服务

注入 JwtTokenStore 类型的 Bean,同时初始化 JWT 转换器 JwtAccessTokenConverter,设置用于解密 JWT 的 公钥 。

配置 资源服务的认证管理,除了 注册和 登录的接口之外,其他的接口都需要 认证 。

新建一个配置类 GlobalMethodSecurityConfig,通过 @EnableGlobalMethodSecurity 注解开启 方法级别的 安全验证 。

拷贝 auth-service 模块的 User、Role 和 UserRepository 三个类到本模块。在 Service 层的 UserService 编写一个 插入用户的方法,代码如下:

配置用于用户密码 加密的工具类 BPwdEncoderUtil:

实现一个 用户注册的 API 接口 /user/register,代码如下:

在 Service 层的 UserServiceDetail 中添加一个 login() 方法,代码如下:

AuthServiceClient 作为 Feign Client,通过向 auth-service 服务接口 /oauth/token 远程调用获取 JWT。在请求 /oauth/token 的 API 接口中,需要在 请求头传入 Authorization 信息, 认证类型( grant_type )、用户名 ( username ) 和 密码( password ),代码如下:

其中,AuthServiceHystrix 为 AuthServiceClient 的 熔断器 ,代码如下:

JWT 包含了 access_token、token_type 和 refresh_token 等信息,代码如下:

UserLoginDTO 包含了一个 User 和一个 JWT 成员属性,用于返回数据的实体:

登录异常类 UserLoginException

全局异常处理切面类 ExceptionHandle

在 Web 层的 UserController 类中新增一个登录的 API 接口 /user/login 如下:

依次启动 eureka-service,auth-service 和 user-service 三个服务。

7. 使用Postman测试

因为没有权限,访问被拒绝。在数据库手动添加 ROLE_ADMIN 权限,并与该用户关联。重新登录并获取 JWT,再次请求 /user/foo 接口。

在本案例中,用户通过 登录接口来获取 授权服务加密后的 JWT。用户成功获取 JWT 后,在以后每次访问 资源服务的请求中,都需要携带上 JWT。 资源服务通过 公钥解密JWT, 解密成功后可以获取 用户信息和 权限信息 ,从而判断该 JWT 所对应的 用户是谁,具有什么 权限 。

获取一次 Token,多次使用, 资源服务不再每次访问 授权服务该 Token 所对应的 用户信息和用户的 权限信息 。

一旦 用户信息或者 权限信息发生了改变,Token 中存储的相关信息并 没有改变 ,需要 重新登录获取新的 Token。就算重新获取了 Token,如果原来的 Token 没有过期,仍然是可以使用的。一种改进方式是在登录成功后,将获取的 Token 缓存在 网关上 。如果用户的 权限更改 ,将 网关上缓存的 Token 删除 。当请求经过 网关 ,判断请求的 Token 在 缓存中是否存在,如果缓存中不存在该 Token,则提示用户 重新登录 。

神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了

之前在SpringBoot项目中一直使用的是SpringFox提供的Swagger库,上了下官网发现已经有接近两年没出新版本了!前几天升级了SpringBoot 2.6.x 版本,发现这个库的兼容性也越来越不好了,有的常用注解属性被废弃了居然都没提供替代!无意中发现了另一款Swagger库SpringDoc,试用了一下非常不错,推荐给大家! SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具,基于OpenAPI 3,目前在Github上已有1.7K+Star,更新发版还是挺勤快的,是一款更好用的Swagger库!值得一提的是SpringDoc不仅支持Spring WebMvc项目,还可以支持Spring WebFlux项目,甚至Spring Rest和Spring Native项目,总之非常强大,下面是一张SpringDoc的架构图。 使用 接下来我们介绍下SpringDoc的使用,使用的是之前集成SpringFox的mall-tiny-swagger项目,我将把它改造成使用SpringDoc。 集成 首先我们得集成SpringDoc,在中添加它的依赖即可,开箱即用,无需任何配置。 -openapi-ui1.6.6 从SpringFox迁移 我们先来看下经常使用的Swagger注解,看看SpringFox的和SpringDoc的有啥区别,毕竟对比已学过的技术能该快掌握新技术; 接下来我们对之前Controller中使用的注解进行改造,对照上表即可,之前在@Api注解中被废弃了好久又没有替代的description属性终于被支持了! /*** 品牌管理Controller* Created by macro on 2019/4/19.*/@Tag(name =PmsBrandController, description =商品品牌管理)@Controller@RequestMapping(/brand)publicclassPmsBrandController{@AutowiredprivatePmsBrandService brandService;privatestaticfinalLogger LOGGER = ();@Operation(summary =获取所有品牌列表,description =需要登录后访问)@RequestMapping(value =listAll, method = )@ResponseBodypublicCommonResult> getBrandList() {(());}@Operation(summary =添加品牌)@RequestMapping(value =/create, method = )@ResponseBody@PreAuthorize(hasRole(ADMIN))publicCommonResult createBrand(@RequestBodyPmsBrand pmsBrand) {CommonResult commonResult;int count = (pmsBrand);if(count ==1) {commonResult = (pmsBrand);(createBrand success:{}, pmsBrand);}else{commonResult = (操作失败);(createBrand failed:{}, pmsBrand);}returncommonResult;}@Operation(summary =更新指定id品牌信息)@RequestMapping(value =/update/{id}, method = )@ResponseBody@PreAuthorize(hasRole(ADMIN))publicCommonResult updateBrand(@PathVariable(id)Longid,@RequestBodyPmsBrand pmsBrandDto, BindingResult result) {CommonResult commonResult;int count = (id, pmsBrandDto);if(count ==1) {commonResult = (pmsBrandDto);(updateBrand success:{}, pmsBrandDto);}else{commonResult = (操作失败);(updateBrand failed:{}, pmsBrandDto);}returncommonResult;}@Operation(summary =删除指定id的品牌)@RequestMapping(value =/delete/{id}, method = )@ResponseBody@PreAuthorize(hasRole(ADMIN))publicCommonResult deleteBrand(@PathVariable(id)Longid) {int count = (id);if(count ==1) {(deleteBrand success :id={}, id);(null);}else{(deleteBrand failed :id={}, id);(操作失败);}}@Operation(summary =分页查询品牌列表)@RequestMapping(value =/list, method = )@ResponseBody@PreAuthorize(hasRole(ADMIN))publicCommonResult> listBrand(@RequestParam(value =pageNum, defaultValue =1)@Parameter(description =页码)Integer pageNum,@RequestParam(value =pageSize, defaultValue =3)@Parameter(description =每页数量)Integer pageSize) {List brandList = (pageNum, pageSize);((brandList));}@Operation(summary =获取指定id的品牌详情)@RequestMapping(value =/{id}, method = )@ResponseBody@PreAuthorize(hasRole(ADMIN))publicCommonResult brand(@PathVariable(id)Longid) {((id));}} 接下来进行SpringDoc的配置,使用OpenAPI来配置基础的文档信息,通过GroupedOpenApi配置分组的API文档,SpringDoc支持直接使用接口路径进行配置。 /*** SpringDoc API文档相关配置* Created by macro on 2022/3/4.*/@ConfigurationpublicclassSpringDocConfig{@BeanpublicOpenAPImallTinyOpenAPI(){returnnewOpenAPI()(newInfo()(Mall-Tiny API)(SpringDoc API 展示)(v1.0.0)(newLicense()(Apache 2.0)(实战电商项目mall(50K+Star)全套文档)(}@BeanpublicGroupedOpenApipublicApi(){()(brand)(/brand/**)();}@BeanpublicGroupedOpenApiadminApi(){()(admin)(/admin/**)();}} 结合SpringSecurity使用 由于我们的项目集成了SpringSecurity,需要通过JWT认证头进行访问,我们还需配置好SpringDoc的白名单路径,主要是Swagger的资源路径; /*** SpringSecurity的配置* Created by macro on 2018/4/26.*/@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity httpSecurity) throws Exception {()// 由于使用的是JWT,我们这里不需要()()// 基于token,所以不需要()()()(,// Swagger的资源路径需要允许访问/,/,/swagger-ui/,/*,/,/**/*,/**/*,/**/*,/swagger-resources/**,/v3/api-docs/**)()(/admin/login)// 对登录注册要允许匿名访问()()//跨域请求会先进行一次options请求()()// 除上面外的所有请求全部需要鉴权认证();}} 然后在OpenAPI对象中通过addSecurityItem方法和SecurityScheme对象,启用基于JWT的认证功能。 /*** SpringDoc API文档相关配置* Created by macro on 2022/3/4.*/@ConfigurationpublicclassSpringDocConfig{privatestaticfinalString SECURITY_SCHEME_NAME =BearerAuth;@BeanpublicOpenAPImallTinyOpenAPI(){returnnewOpenAPI()(newInfo()(Mall-Tiny API)(SpringDoc API 展示)(v1.0.0)(newLicense()(Apache 2.0)(实战电商项目mall(50K+Star)全套文档)(}} 测试 接下来启动项目就可以访问Swagger界面了,访问地址:我们先通过登录接口进行登录,可以发现这个版本的Swagger返回结果是支持高亮显示的,版本明显比SpringFox来的新; 然后通过认证按钮输入获取到的认证头信息,注意这里不用加bearer前缀; 之后我们就可以愉快地访问需要登录认证的接口了; 看一眼请求参数的文档说明,还是熟悉的Swagger样式! 常用配置 SpringDoc还有一些常用的配置可以了解下,更多配置可以参考官方文档。 springdoc:swagger-ui:# 修改Swagger UI路径path:/# 开启Swagger UI界面enabled:trueapi-docs:# 修改api-docs路径path:/v3/api-docs# 开启api-docsenabled:true# 配置需要生成接口文档的扫描包# 配置需要生成接口文档的接口路径paths-to-match:/brand/**,/admin/** 总结 在SpringFox的Swagger库好久不出新版的情况下,迁移到SpringDoc确实是一个更好的选择。 今天体验了一把SpringDoc,确实很好用,和之前熟悉的用法差不多,学习成本极低。 而且SpringDoc能支持WebFlux之类的项目,功能也更加强大,使用SpringFox有点卡手的朋友可以迁移到它试试! 参考资料 项目地址:官方文档:项目源码地址

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Spring

“6-Spring-提供的四种弱小工具-远程接口调用神器 (6sp日常使用还能用多久)” 的相关文章

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

什么是AOP? AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,其主要目的是将横切关注点(cross-cutting concern)从主要业务...

Spring-释放数据传输潜力的数据压缩技术-微服务 (springboot启动)

Spring-释放数据传输潜力的数据压缩技术-微服务 (springboot启动)

简介 随着云原生架构的兴起,微服务已成为可扩展和可维护系统的重要构建块。顾名思义,微服务是小型的、独立的服务,它们共同构成一个完整的系统。当使用微服务构建系统时,尤其是那些具有大量数据交换的系统...

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

SpringBeanDefinition元信息定义形式 BeanDefinition是一个蕴含Bean元数据的对象。它形容了如何创立Bean实例、Bean属性的值以及Bean之间的依赖相关。...

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

SpringBoot是一个基于Spring的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用程序。随着SpringBoot2.0版本的发布,其功能和性能得...

Security权限控制框架入门指南-Spring (security)

Security权限控制框架入门指南-Spring (security)

在罕用的后盾治理系统中,通常都会有访问权限控制的需求,用于限度不同人员关于接口的访问才干,假设用户不具有指定的权限,则不能访问某些接口。 本文将用waynboot-mall名目举例,给大家引...

Boot-Spring-与-3.0-加速应用性能的完美融合-GraalVM (bootstrap)

Boot-Spring-与-3.0-加速应用性能的完美融合-GraalVM (bootstrap)

在 2023 年,SpringBoot 3.0 的发布标志着 Spring 框架对 GraalVM 的全面支持。此支持对 Spring 技术栈来说是一项重大补充。 GraalVM 概述...

Spring-Webflux-Boot-虚构线程性能逊色于-深化比较 (springboot)

Spring-Webflux-Boot-虚构线程性能逊色于-深化比较 (springboot)

早上看到一篇关于SpringBoot虚构线程和Webflux性能对比的文章,感觉还不错。内容较长,抓重点给大家引见一下这篇文章的外围内容,繁难大家极速浏览。 测试场景 作者驳回了一个尽...

揭秘-的暗藏技艺-AOP-从概念到实用场景-Spring (神秘丂丂是什么意思)

揭秘-的暗藏技艺-AOP-从概念到实用场景-Spring (神秘丂丂是什么意思)

环境:Spring5.3.23 1.引见 当天看Spring文档看到这么一个常识点《ControlFlowPointcuts》都不好翻译 官网原文: Springcontr...