Spring cloud gateway(Web MVC)的深入使用
一定是spring boot項(xiàng)目,spring cloud gateway基于spring boot
前言
提示:本文所用的是spring cloud gateway web mvc特性
本文提供了對(duì)spring cloud gateway網(wǎng)關(guān)的使用案例,并沒(méi)有列舉出所有過(guò)濾器或謂詞的使用示例,但是包含了從工程搭建及基本使用至概念理解再到一些自定義客制化的使用。為你打開(kāi)基本使用到深入使用的一扇門(mén)。所配關(guān)鍵代碼都有注釋?zhuān)欢梢詾槟愦鹨山饣蟆?/strong>
一、前置條件
提示:spring cloud gateway是基于spring boot,項(xiàng)目一定是spring boot項(xiàng)目,一定是spring boot項(xiàng)目
jdk:17
構(gòu)建工具:maven 3.6.3
spring相關(guān)jar:spring-cloud-starter-gateway-server-webmvc 4.3.0(必須),spring boot 3.5.8(被間接依賴(lài)至項(xiàng)目中),spring cloud 2025.0.0(作為pom)
參考資料:https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webmvc.html
開(kāi)發(fā)工具:idea 2021.2
二、工程搭建(創(chuàng)建一個(gè)普通maven工程,添加必要依賴(lài)及構(gòu)建工具即可,本案例是一個(gè)maven子工程)
提示:按需可引入spring boot starter parent,直接按需用spring 配套的插件及依賴(lài)包,更為方便
父工程pom.xml (僅列出關(guān)鍵依賴(lài))

工程目錄

pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springCloudMicroService</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gatewayServerWebMvcDemo</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!-- 設(shè)置編碼格式,防止maven打包構(gòu)建時(shí)沒(méi)有統(tǒng)一編碼格式導(dǎo)致有中文注釋的文件解析異常,影響項(xiàng)目啟動(dòng) -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway-server-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- spring boot構(gòu)建相關(guān)配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.5.8</version>
<configuration>
<mainClass>${start-class}</mainClass>
<layout>JAR</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<!-- 【很關(guān)鍵】自定義${}占位符,用于將pom文件的變量動(dòng)態(tài)替換到applicaton**.yml的某處
例如這里的application.yml文件,使用${spring.profiles.active}取
將pom.xml->properties->profile->properties->spring.profiles.active屬性值
-->
<delimiters>
<delimiter>${}</delimiter>
</delimiters>
<!-- 禁用默認(rèn)的占位符@xxPropertiesName@ -->
<useDefaultDelimiters>false</useDefaultDelimiters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 根據(jù)需要開(kāi)啟或關(guān)閉 -->
<includes>
<include>public/**</include>
<include>static/**</include>
<include>templates/**</include>
<include>mapper/**</include>
<include>properties/**</include>
<include>i18n/**</include>
<include>logback*.xml</include>
<!-- 包含默認(rèn)的配置文件,這個(gè)配置文件僅有spring.profiles.active屬性,這是不加profiles啟動(dòng)的關(guān)鍵 -->
<include>application.yml</include>
<!-- 按maven不同的打包參數(shù),打包不同的環(huán)境相關(guān)的配置文件 -->
<include>application-${spring.profiles.active}.*</include>
<include>log*-${spring.profiles.active}.xml</include>
</includes>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
<!-- profiles 相關(guān)配置 -->
<profiles>
<!--
profile中的<id>div</id>元素值指的是-P 的參數(shù), 如:mvn clean install -P div
profile中的<properties><spring.profiles.active>dev</spring.profiles.active></properties>中的spring.profiles.active元素及值
值指的是-D 的參數(shù), 如:mvn clean install -Dspring.profiles.active=dev
-->
<profile>
<!-- 開(kāi)發(fā)環(huán)境 -->
<id>dev</id>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 測(cè)試環(huán)境 -->
<profile>
<id>sit</id>
<properties>
<spring.profiles.active>sit</spring.profiles.active>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<!-- 生產(chǎn)環(huán)境 -->
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
</project>三、功能實(shí)現(xiàn)范圍
- 配置文件或java編程方式的路由配置
- 自定義過(guò)濾器(filter)、自定義謂詞(predicate)的實(shí)現(xiàn)與使用
- 路由到本服務(wù)接口(就是用于spring mvc的函數(shù)式端點(diǎn)的使用)
四、需要路由訪問(wèn)的服務(wù)(應(yīng)用)準(zhǔn)備
網(wǎng)關(guān)自身(服務(wù)/應(yīng)用):http://localhost:8888
應(yīng)用一:http://localhost:8081/entitleservice
應(yīng)用二:http://localhost:8082/functonservletpath
五、路由配置(配置文件方式)
提示:兩種路由配置方式二選一,二選一,二選一?。?!
默認(rèn)配置文件(application.yml)
server:
server-name: gatewaymvcdemo
port: 8888
spring:
profiles:
# active: javaconfig
active: fileconfig路由配置文件(application-fileconfig.yml)
# 使用配置文件方式配置路由
spring:
cloud:
gateway:
server:
webmvc:
routes:
# 配置路由到function demo服務(wù)
- id: function_demo_route
uri: http://localhost:8082
predicates:
- Method=GET,PUT,DELETE,POST
- Path=/functionservletpath/**
filters:
- AddRequestParameter=code, gateway for functiondemo
- AddRequestHeader=function-Request-Id,function_header_value
- id: entitle_route
uri: http://localhost:8081
predicates:
- Method=GET,PUT,DELETE,POST
- Path=/entitleservice/info/**,/entitleservice/gatewayInfo/**,/entitleservice/user/**,/entitleservice/role/**
- predicateHeaderExists=custom_header
filters:
- AddRequestParameter=code, gate way for entitleservice
- AddRequestHeader=entitle-Request-Id,entitle_header_value
- instrumentForFilter=req_header,rep_header六、路由配置(java編程方式)
提示:兩種路由配置方式二選一,二選一,二選一?。。。?/code>
默認(rèn)配置文件(application.yml)
server:
server-name: gatewaymvcdemo
port: 8888
spring:
profiles:
active: javaconfig路由配置文件(application-javaconfig.yml)提示:路由配置文件為空,因使用java編程方式配置
java配置文件(ApplicationRoutingConfig.java)
package com.mrhan.config;
import com.mrhan.service.GatewayHandler;
import com.mrhan.service.UserHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.*;
import java.time.ZonedDateTime;
import java.util.function.BiFunction;
import java.util.function.Function;
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.*;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.*;
import static org.springframework.web.servlet.function.RequestPredicates.accept;
/**
* @author Mr han
* @date 2025/12/6
* @description 路由配置,此處配置了路由后,application.yml中配置的路由將無(wú)效,兩種配置只能存在一種,不能并存
* 同等效果配置文件方式配置@see application.yml,自定義的filter和predicate在兩種配置方式都能夠生效
*
*
*/
@Configuration(proxyBeanMethods = false)
@Profile("javaconfig")
public class ApplicationRoutingConfig {
private static final Logger log = LoggerFactory.getLogger(ApplicationRoutingConfig.class);
/**
*
* @return
* @date 2025/12/17
* @description 使用java代碼方式配置路由,等價(jià)于@see application.yml文件配置方式
*
*/
@Bean
public RouterFunction<ServerResponse> customRoutes(GatewayHandler gatewayHandler) {
// @formatter:off
return route("path_route")
.GET("/gateway/getRole", accept(MediaType.TEXT_HTML),gatewayHandler::getRole)
.POST("/gateway/updateRole/{roleId}", accept(MediaType.APPLICATION_JSON), gatewayHandler::updateRole)
.before(request -> {
String path = request.requestPath().value();
log.error("=========開(kāi)始進(jìn)入本服務(wù)請(qǐng)求:{}=========",path);
return request;
})
// 添加請(qǐng)求之后的函數(shù)處理器
.after((request,response) -> {
log.error("==========本服務(wù)請(qǐng)求處理完畢:{},響應(yīng)的狀態(tài)碼:",request.requestPath().value(),response.statusCode());
return response;
})
.build().and(route("entitle_route")
.route(path("/entitleservice/**").and(SampleRequestPredicates.predicateHeaderExists("entitle_header")), http())
.before(uri("http://localhost:8081"))
.before(addRequestParameter("code","Java gateway for entitlementservice"))
.before(addRequestHeader("java_config_header","java config value"))
.filter(SampleHandlerFilterFunctions.instrumentForFilter("req_header","rep_header"))
.build().and(route("function_demo_route")
.route(path("/functionservletpath/**").and(SampleRequestPredicates.predicateHeaderExists("function_header")), http())
.before(uri("http://localhost:8082"))
.before(addRequestParameter("code","Java config gateway for functiondemo"))
.before(addRequestHeader("function-Request-Id","function_header_value"))
.build()));
}
/**
* @author Mr han
* @date 2025/12/15
* @description 自定義的predicate 是否包含某個(gè)固定的請(qǐng)求頭,此類(lèi)的實(shí)現(xiàn)等等同于方法 @see {@link SampleRequestPredicates#predicateHeaderExists(String)}
*
*/
private static class CustomHeaderExists implements RequestPredicate {
// 請(qǐng)求頭名稱(chēng)
private static final String HEADER_NAME = "custom_header";
/**
*
* @return
* @date 2025/12/15
* @description 需要包含custom_header請(qǐng)求頭
*
*/
@Override
public boolean test(ServerRequest request) {
return request.headers().asHttpHeaders().containsKey(HEADER_NAME);
}
}
/**
*
* @return
* @date 2025/12/15
* @description 使用函數(shù)式的方法,自定義過(guò)濾器,使用函數(shù)式方法實(shí)現(xiàn)過(guò)濾器
* 在自定義的過(guò)濾器中可以實(shí)現(xiàn)日志的打印,已經(jīng)權(quán)限的認(rèn)證等邏輯,這里僅僅是增加請(qǐng)求頭及響應(yīng)頭
* 此方法等同于@see {@link SampleHandlerFilterFunctions#instrumentForFilter(String, String)}
*
*/
private static HandlerFilterFunction<ServerResponse, ServerResponse> instrumentWithFilter(String requestHeader,String responseHeader){
return (request,next) -> {
ServerRequest modifier = ServerRequest.from(request).header(requestHeader, "hello").build();
ServerResponse responseHandler = next.handle(modifier);
responseHandler.headers().add(responseHeader, "world");
return responseHandler;
};
}
/**
*
* @return
* @date 2025/12/15
* @description 使用函數(shù)式的方法,定義before方式的過(guò)濾器
*
*/
private static Function<ServerRequest, ServerRequest> instrumentWithBefore(String requestHeader){
return request -> {
return ServerRequest.from(request).header(requestHeader, "before_header_value").build();
};
}
/**
*
* @return
* @date 2025/12/15
* @description 使用函數(shù)式的方法,定義after方式的過(guò)濾器
*
*/
private static BiFunction<ServerRequest, ServerResponse, ServerResponse> instrumentWithAfter(String header){
return (request,response) -> {
response.headers().add(header, "after_header_value");
return response;
};
}
}七、自定義過(guò)濾器
· 提示:定義的過(guò)濾器類(lèi)按一個(gè)類(lèi)一個(gè)靜態(tài)方法,多增加幾個(gè)靜態(tài)方法spring也只會(huì)加載第一個(gè)靜態(tài)方法,靜態(tài)方法一定要加@Shotcut注解,不然啟動(dòng)報(bào)錯(cuò),報(bào)錯(cuò)原因分析及解決,將在另一篇關(guān)于gateway疑難雜癥解決的文章中展開(kāi)。
過(guò)濾器定義(SampleHandlerFilterFunctions.java):一個(gè)類(lèi)一個(gè)靜態(tài)過(guò)濾器方法(方法上一定要加上@Shortcut注解),多加了也沒(méi)用spring只會(huì)加載第一個(gè)靜態(tài)方法
package com.mrhan.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.server.mvc.common.Configurable;
import org.springframework.cloud.gateway.server.mvc.common.Shortcut;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.function.HandlerFilterFunction;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;
import java.util.Objects;
import java.util.function.Function;
/**
* @author Mr han
* @date 2025/12/15
* @description 定義包含所有自定義filter的函數(shù)式過(guò)濾器類(lèi),供filtersupplier類(lèi)使用暴露到項(xiàng)目中
* 一個(gè)類(lèi)只能定義一個(gè)靜態(tài)方法,spring cloud gateway只注冊(cè)一個(gè)靜態(tài)方法
*/
public class SampleHandlerFilterFunctions {
private static final Logger log = LoggerFactory.getLogger(SampleHandlerFilterFunctions.class);
@Shortcut
public static HandlerFilterFunction<ServerResponse, ServerResponse> instrumentForFilter(String reqHeaderName,String repHeaderName) {
return (request, next) -> {
log.error("==========進(jìn)入自定義filter處理邏輯,請(qǐng)求頭:{},響應(yīng)頭{}===========",reqHeaderName,repHeaderName);
ServerRequest modified = ServerRequest.from(request)
.header(reqHeaderName, "request header for filter").build();
ServerResponse response = next.handle(modified);
response.headers().add(repHeaderName,"response header for filter" );
return response;
};
}過(guò)濾器提供者(CustomFilterSupplier.java):就是一個(gè)繼承了SimpleFilterSupplier類(lèi)的類(lèi)而已,重寫(xiě)了繼承方法
package com.mrhan.config;
import org.springframework.cloud.gateway.server.mvc.filter.SimpleFilterSupplier;
/**
* @author Mr han
* @date 2025/12/15
* @description 創(chuàng)建字對(duì)應(yīng)的filterSupplier,用于注冊(cè)提供自定義的filter
*/
public class CustomFilterSupplier extends SimpleFilterSupplier {
public CustomFilterSupplier() {
super(SampleHandlerFilterFunctions.class);
}
}過(guò)濾器配置類(lèi)(FilterConfiguration.java):只是為了將過(guò)濾器提供者注冊(cè)為Bean
package com.mrhan.config;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* @author Mr han
* @date 2025/12/17
* @description 注冊(cè)自定義的過(guò)濾器,用于配置在application.yml文件中,目前使用此配置方式無(wú)實(shí)際效果 TODO
*/
@Configuration
@Profile("fileconfig")
public class FilterConfiguration {
private static final Logger log = LoggerFactory.getLogger(FilterConfiguration.class);
@PostConstruct
public void init(){
log.error("========開(kāi)始加載FilterConfiguration配置============");
}
@Bean
public CustomFilterSupplier customFilterSupplier() {
return new CustomFilterSupplier();
}
}八、自定義謂詞
提示:定義的謂詞按一個(gè)類(lèi)一個(gè)靜態(tài)方法,多增加幾個(gè)靜態(tài)方法spring也只會(huì)加載第一個(gè)靜態(tài)方法,靜態(tài)方法一定要加@Shortcut注解,不然啟動(dòng)報(bào)錯(cuò),報(bào)錯(cuò)原因分析及解決,將在另一篇關(guān)于gateway疑難雜癥解決的文章中展開(kāi)。
謂詞定義(SampleRequestPredicates.java):一個(gè)類(lèi)一個(gè)靜態(tài)過(guò)濾器方法(一定要加上@ShortCut注解),多加了也沒(méi)用spring只會(huì)加載第一個(gè)靜態(tài)方法
package com.mrhan.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.server.mvc.common.Configurable;
import org.springframework.cloud.gateway.server.mvc.common.Shortcut;
import org.springframework.web.servlet.function.RequestPredicate;
/**
* @author Mr han
* @date 2025/12/15
* @description 定義包含自定義Predicate的所有實(shí)現(xiàn)的類(lèi)
*/
public class SampleRequestPredicates {
private static final Logger log = LoggerFactory.getLogger(SampleRequestPredicates.class);
/**
*
* @return
* @date 2025/12/15
* @description 請(qǐng)求頭的判斷(是否包含某個(gè)名稱(chēng)的請(qǐng)求頭),必須添加@Configurable注解且只能有一個(gè)參數(shù),不然無(wú)法生效
*
*/
@Shortcut
public static RequestPredicate predicateHeaderExists(String name) {
log.error("======進(jìn)入了自定義predicate的處理邏輯所需請(qǐng)求頭:{}==========",name);
return request -> {
return request.headers().asHttpHeaders().containsKey(name);
};
}
}謂詞提供者(CustomPredicateSupplier.java):就是一個(gè)實(shí)現(xiàn)了PredicateSupplier接口的類(lèi)
package com.mrhan.config;
import org.springframework.cloud.gateway.server.mvc.predicate.PredicateSupplier;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
public class CustomPredicateSupplier implements PredicateSupplier {
@Override
public Collection<Method> get() {
return Arrays.asList(SampleRequestPredicates.class.getMethods());
}
}謂詞配置類(lèi)(PredicateConfiguration.java):只是為了將謂詞提供者注冊(cè)為Bean
package com.mrhan.config;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.server.mvc.predicate.PredicateSupplier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* @author Mr han
* @date 2025/12/17
* @description 注冊(cè)自定義的predicate,用在application.yml中
*/
@Configuration
@Profile("fileconfig")
public class PredicateConfiguration {
private static final Logger log = LoggerFactory.getLogger(PredicateConfiguration.class);
@PostConstruct
public void init(){
log.error("========開(kāi)始加載PredicateConfiguration配置============");
}
@Bean
public CustomPredicateSupplier customPredicateSupplier() {
return new CustomPredicateSupplier();
}
}九、自定義謂詞、自定義過(guò)濾器的使用(配置文件或java編程方式)
配置文件方式:格式"靜態(tài)方法名(首字母大寫(xiě)小寫(xiě)都可)=參數(shù)值"

java編程方式:直接調(diào)用過(guò)濾器或謂詞方法即可

十、效果驗(yàn)證(配置文件方式的路由效果)
未配置指定請(qǐng)求頭:訪問(wèn)404

配置指定請(qǐng)求頭:驗(yàn)證自定義的過(guò)濾器,謂詞等效果

十一、一些疑問(wèn)、困惑的解釋
- 配置中的uri是干嘛的?
解釋:處理轉(zhuǎn)發(fā)過(guò)來(lái)的請(qǐng)求的服務(wù)器地址 - 怎么理解網(wǎng)關(guān)?
解釋:將匹配(含你定義的請(qǐng)求路徑、攜帶了某個(gè)請(qǐng)求頭、請(qǐng)求參數(shù)等)你謂詞(predicate)的請(qǐng)求經(jīng)過(guò)一系列處理(過(guò)濾器的路徑重寫(xiě)、添加請(qǐng)求頭、參數(shù)等)后轉(zhuǎn)給你指定的處理器(可能是訪問(wèn)的服務(wù)地址,可能是你指定處理該請(qǐng)求的一個(gè)方法)做處理,是請(qǐng)求訪問(wèn)的守門(mén)員。
總結(jié)
到此這篇關(guān)于Spring cloud gateway(Web MVC)的使用全集的文章就介紹到這了,更多相關(guān)Spring cloud gateway使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud?Gateway的使用?+?Nacos動(dòng)態(tài)路由實(shí)踐指南
- Spring Cloud Gateway詳細(xì)使用最佳實(shí)踐
- 使用Spring Cloud Gateway實(shí)現(xiàn)動(dòng)態(tài)路由的核心原理
- 使用Spring Cloud Gateway實(shí)現(xiàn)代理服務(wù)
- 使用SpringCloud Gateway解決跨域問(wèn)題
- Spring Cloud Gateway組件的三種使用方式實(shí)例詳解
- SpringCloud服務(wù)網(wǎng)關(guān)Gateway的使用教程詳解
- SpringCloud中Gateway的使用教程詳解
- 使用SpringCloudApiGateway之支持Cors跨域請(qǐng)求
相關(guān)文章
2025.2.X?版本?IDEA?maven?打包亂碼問(wèn)題的解決方案(最新整理)
IDEA?2025.2版本默認(rèn)GBK編碼導(dǎo)致Maven打包亂碼,即使調(diào)整文件編碼也無(wú)濟(jì)于事,解決方法是修改Maven?Runner設(shè)置,添加UTF-8環(huán)境變量,并清理緩存重啟,建議在新建項(xiàng)目時(shí)同步設(shè)置,本文給大家介紹2025.2.X版本IDEA?maven打包亂碼問(wèn)題的解決方案,感興趣的朋友一起看看吧2025-10-10
Java實(shí)現(xiàn)鏈表的常見(jiàn)操作算法詳解
這篇文章主要介紹了Java實(shí)現(xiàn)鏈表的常見(jiàn)操作算法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
springmvc Rest風(fēng)格介紹及實(shí)現(xiàn)代碼示例
這篇文章主要介紹了springmvc Rest風(fēng)格介紹及實(shí)現(xiàn)代碼示例,rest風(fēng)格簡(jiǎn)潔,分享了HiddenHttpMethodFilter 的源碼,通過(guò)Spring4.0實(shí)現(xiàn)rest風(fēng)格源碼及簡(jiǎn)單錯(cuò)誤分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Spring Security實(shí)現(xiàn)禁止用戶(hù)重復(fù)登陸的配置原理
這篇文章主要介紹了Spring Security實(shí)現(xiàn)禁止用戶(hù)重復(fù)登陸的配置原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java?Process中waitFor()的問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于Java?Process中waitFor()問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-12-12
java實(shí)現(xiàn)文件變化監(jiān)控的方法(推薦)
下面小編就為大家?guī)?lái)一篇java實(shí)現(xiàn)文件變化監(jiān)控的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決
這篇文章主要介紹了MybatisPlus?LambdaQueryWrapper使用int默認(rèn)值的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01
Java 互相關(guān)聯(lián)的實(shí)體無(wú)限遞歸問(wèn)題的解決
這篇文章主要介紹了Java 互相關(guān)聯(lián)的實(shí)體無(wú)限遞歸問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

