从@CrossOrigin到Gateway详解Spring Boot跨域处理的10种姿势

 更新时间:2025年11月13日 08:47:15   作者:小筱在线  
在前后端分离架构成为主流的今天,跨域问题已成为每个Web开发者必须面对的挑战,本文将系统性地介绍10种Spring Boot跨域处理方案,下面小编就和大家简单介绍一下吧

引言:跨域问题的本质与Spring Boot解决方案全景

在前后端分离架构成为主流的今天,跨域问题已成为每个Web开发者必须面对的挑战。当浏览器向不同源(协议+域名+端口)的服务端发起请求时,同源策略会阻止这类请求,这是浏览器最基本的安全机制之一。Spring Boot作为Java生态中最流行的Web开发框架,提供了从简单到复杂、从局部到全局的多种跨域解决方案。

本文将系统性地介绍10种Spring Boot跨域处理方案,涵盖从最基础的注解配置到微服务架构下的网关全局配置,每种方案都将深入分析其实现原理、适用场景、潜在陷阱及最佳实践。无论您是开发小型单体应用还是复杂微服务系统,都能在这里找到适合的跨域解决方案。

方案1:@CrossOrigin注解——快速上手的局部解决方案

@CrossOrigin是Spring框架提供的最直观的跨域解决方案,通过在控制器类或方法上添加该注解,可以快速为特定接口启用跨域支持。

基础实现与高级配置

// 方法级别跨域配置
@RestController
public class ProductController {
    
    @CrossOrigin(origins = "http://localhost:3000")
    @GetMapping("/products")
    public List<Product> getProducts() {
        // 业务逻辑
    }
}

// 类级别跨域配置
@CrossOrigin(origins = "http://trusted-domain.com", maxAge = 3600)
@RestController
@RequestMapping("/api/v2")
public class OrderController {
    // 所有方法继承类级别跨域配置
}

适用场景与常见陷阱

典型应用场景

  • 快速原型开发阶段
  • 只有少数接口需要特殊跨域规则
  • 测试环境临时验证跨域功能

高频踩坑点

  • 生产环境安全隐患:使用origins = "*"会导致安全漏洞,应明确指定可信域名
  • 配置继承问题:类和方法同时使用注解时,方法级配置会完全覆盖类级配置
  • 与全局配置冲突:当同时存在WebMvcConfigurer配置时,行为可能不符合预期

最佳实践建议

  • 生产环境必须避免使用通配符*,采用白名单机制
  • 优先在类级别统一配置,保持项目一致性
  • 对于RESTful API,建议结合@RequestMapping在类级别定义基础路径

方案2:WebMvcConfigurer全局配置——统一管理的优雅方案

对于中大型项目,通过实现WebMvcConfigurer接口进行全局跨域配置是更专业的选择。

基础配置与多规则策略

@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 公共API配置
        registry.addMapping("/api/public/**")
            .allowedOrigins("*")
            .allowedMethods("GET", "POST")
            .maxAge(1800);
            
        // 管理后台API配置
        registry.addMapping("/api/admin/**")
            .allowedOrigins("https://admin.example.com")
            .allowedMethods("*")
            .allowCredentials(true)
            .exposedHeaders("X-Auth-Token");
    }
}

动态源配置进阶

结合配置中心实现动态跨域规则:

@Configuration
@RefreshScope
public class DynamicCorsConfig implements WebMvcConfigurer {
    
    @Value("${cors.allowed-origins}")
    private String[] allowedOrigins;
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins(allowedOrigins)
            // 其他配置...
    }
}

性能优化与安全考量

性能优化技巧

  • 合理设置maxAge减少预检请求(建议3600秒)
  • 按API分类配置,避免过于宽泛的/**匹配
  • 对只读API禁用非安全方法(PUT/DELETE等)

安全加固建议

  • 管理接口必须设置allowCredentials(false)除非必要
  • 敏感接口应限制allowedHeaders避免不必要的头信息暴露
  • 生产环境推荐使用allowedOriginPatterns替代allowedOrigins以支持正则匹配

方案3:CorsFilter——底层控制的灵活方案

对于需要完全掌控跨域流程的场景,自定义CorsFilter提供了最大的灵活性。

基础过滤器实现

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomCorsFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
        throws IOException, ServletException {
        
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        
        // 动态源检测
        String origin = request.getHeader("Origin");
        if (isAllowedOrigin(origin)) {
            response.setHeader("Access-Control-Allow-Origin", origin);
            response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
            response.setHeader("Access-Control-Expose-Headers", "X-Custom-Header");
            response.setHeader("Access-Control-Allow-Credentials", "true");
        }
        
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
    
    private boolean isAllowedOrigin(String origin) {
        // 实现源验证逻辑
    }
}

微服务架构下的特殊处理

在Spring Cloud微服务架构中,需要特别注意:

@Bean
public FilterRegistrationBean<CustomCorsFilter> corsFilterRegistration() {
    FilterRegistrationBean<CustomCorsFilter> registration = 
        new FilterRegistrationBean<>(new CustomCorsFilter());
    registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
    registration.setName("customCorsFilter");
    return registration;
}

性能陷阱与优化方案

常见性能问题

  • 每次请求都执行源验证逻辑,增加CPU开销
  • 过滤器链顺序不当导致多次处理
  • 未合理缓存预检请求结果

优化方案

  • 使用缓存存储已验证的源(如Caffeine)
  • 确保过滤器在安全过滤器之前执行
  • 对静态资源使用不同过滤策略

方案4:Spring Security集成——安全场景的专业方案

当项目引入Spring Security时,跨域配置需要特殊处理以确保安全过滤器链正确工作。

基础安全配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors(withDefaults())  // 启用默认CORS配置
            .csrf().disable()      // 根据需求决定是否禁用CSRF
            .authorizeRequests()
            .antMatchers("/api/public/**").permitAll()
            .anyRequest().authenticated();
    }
    
    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

OAuth2资源服务器的特殊配置

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .cors().configurationSource(corsConfigurationSource())
            .and()
            .authorizeRequests()
            .antMatchers("/api/**").authenticated();
    }
    
    // CORS配置同上
}

安全加固建议

  • 认证接口特殊处理:对/oauth/token等认证接口应限制只允许必要的方法(POST)
  • 敏感头信息控制:避免暴露Authorization等敏感头信息
  • CSRF与CORS协调:当使用会话认证时,需要协调CSRF和CORS策略

方案5:ResponseEntity手动控制——完全掌控的专家方案

对于需要根据业务逻辑动态决定跨域策略的特殊场景,可以直接在控制器中操作响应头。

动态跨域决策实现

@RestController
@RequestMapping("/dynamic")
public class DynamicCorsController {
    
    @GetMapping("/resource")
    public ResponseEntity<Resource> getResource(
            @RequestParam String token,
            HttpServletRequest request) {
        
        HttpHeaders headers = new HttpHeaders();
        if (isValidToken(token)) {
            headers.setAccessControlAllowOrigin(request.getHeader("Origin"));
            headers.setAccessControlAllowCredentials(true);
        } else {
            headers.setAccessControlAllowOrigin("https://trusted.example.com");
        }
        
        return ResponseEntity.ok()
            .headers(headers)
            .body(createResource());
    }
}

预检请求特殊处理

@RestController
public class PreflightController {
    
    @RequestMapping(value = "/complex", method = {RequestMethod.OPTIONS, RequestMethod.GET})
    public ResponseEntity<?> handleComplexRequest(HttpServletRequest request) {
        if (HttpMethod.OPTIONS.matches(request.getMethod())) {
            HttpHeaders headers = new HttpHeaders();
            headers.setAccessControlAllowOrigin("*");
            headers.setAccessControlAllowMethods(Arrays.asList("GET", "POST", "PUT"));
            return ResponseEntity.ok().headers(headers).build();
        }
        
        // 正常业务处理
        return ResponseEntity.ok("Complex Response");
    }
}

适用场景与维护建议

适用场景

  • 需要根据业务参数动态决定跨域规则
  • 特殊接口需要非标准CORS行为
  • 教育演示CORS工作原理

维护建议

  • 提取公共头操作到工具类减少重复代码
  • 为每个动态规则编写单元测试
  • 在控制器Advice中统一处理常见头操作

方案6:Spring Cloud Gateway全局配置——微服务架构的解决方案

在微服务架构中,通过API网关统一处理跨域是更合理的方案。

基础网关配置

# application.yml
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "https://example.com"
            allowedMethods: "*"
            allowedHeaders: "*"
            allowCredentials: true
            maxAge: 3600

动态路由配置

结合路由定义的细粒度控制:

spring:
  cloud:
    gateway:
      routes:
      - id: product-service
        uri: lb://product-service
        predicates:
        - Path=/api/products/**
        filters:
        - name: Cors
          args:
            allowedOrigins: https://web.example.com
            allowedMethods: GET,POST
            
      - id: admin-service
        uri: lb://admin-service
        predicates:
        - Path=/api/admin/**
        filters:
        - name: Cors
          args:
            allowedOrigins: https://admin.example.com
            allowedMethods: "*"

网关层最佳实践

  • 分层防御:在网关和微服务两层都配置适当的CORS规则
  • 性能考量:网关层设置较长的maxAge(如86400秒)
  • 安全建议:网关日志应记录Origin头以便审计

方案7:Nginx反向代理——基础设施层解决方案

对于部署在Nginx后的Spring Boot应用,可在Nginx层解决跨域问题。

基础Nginx配置

server {
    listen 80;
    server_name api.example.com;
    
    location / {
        # 跨域配置
        add_header 'Access-Control-Allow-Origin' 'https://web.example.com';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        add_header 'Access-Control-Allow-Credentials' 'true';
        
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain; charset=utf-8';
            add_header 'Content-Length' 0;
            return 204;
        }
        
        proxy_pass http://springboot-app:8080;
    }
}

多环境配置管理

使用Nginx map实现环境差异化配置:

map $http_origin $cors_origin {
    default "";
    "~^https://(.*\.)?example\.com$" $http_origin;
    "~^http://localhost(:[0-9]+)?$" $http_origin;
}

server {
    # ...
    add_header 'Access-Control-Allow-Origin' $cors_origin;
}

运维注意事项

  • 配置缓存:修改Nginx配置后需要重载(nginx -s reload)
  • 头信息覆盖:注意Spring Boot应用不应再设置CORS头,避免冲突
  • 性能监控:关注add_header对Nginx性能的影响

方案8:WebFlux响应式编程方案

对于使用Spring WebFlux的响应式应用,跨域配置有特殊方式。

注解配置方式

@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class ReactiveController {
    
    @GetMapping("/flux")
    public Flux<Data> getFluxData() {
        return dataService.streamData();
    }
}

全局配置实现

@Configuration
public class GlobalCorsConfig implements WebFluxConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("https://example.com")
            .allowedMethods("GET", "POST")
            .maxAge(3600);
    }
}

函数式API配置

@Configuration
public class RouterConfig {
    
    @Bean
    public RouterFunction<ServerResponse> route(Handler handler) {
        return RouterFunctions.route()
            .GET("/functional", handler::handle)
            .filter((request, next) -> {
                ServerResponse response = next.handle(request);
                return response
                    .header("Access-Control-Allow-Origin", "*")
                    .header("Access-Control-Allow-Methods", "GET");
            })
            .build();
    }
}

方案9:Spring Boot Actuator特殊处理

对Actuator端点的跨域需要单独配置。

安全配置示例

@Configuration
public class ActuatorCorsConfig {
    
    @Bean
    public WebMvcConfigurer actuatorCorsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/actuator/**")
                    .allowedOrigins("https://monitor.example.com")
                    .allowedMethods("GET")
                    .allowCredentials(true);
            }
        };
    }
}

安全建议

  • 严格限制源:Actuator接口只允许监控系统访问
  • 方法限制:通常只需要GET方法
  • 认证要求:应结合Spring Security保护Actuator端点

方案10:混合部署场景的综合方案

当Spring Boot应用同时提供Web界面和API时,需要综合考虑。

前后端混合配置

@Configuration
public class HybridCorsConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // API接口配置
        registry.addMapping("/api/**")
            .allowedOrigins("https://external.example.com")
            .allowedMethods("*");
            
        // 内部Web接口配置
        registry.addMapping("/web/**")
            .allowedOrigins("https://portal.example.com")
            .allowCredentials(true);
    }
}

静态资源特殊处理

@Configuration
public class ResourceConfig implements WebMvcConfigurer {
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/")
            .setCachePeriod(3600)
            .resourceChain(true)
            .addResolver(new PathResourceResolver() {
                @Override
                protected Resource getResource(String resourcePath, 
                    Resource location) throws IOException {
                    Resource requestedResource = location.createRelative(resourcePath);
                    return requestedResource.exists() && requestedResource.isReadable() 
                        ? requestedResource : new ClassPathResource("/static/index.html");
                }
            });
    }
}

综合对比与选型指南

方案适用场景优点缺点性能影响
@CrossOrigin快速原型、少数接口简单直观难以维护、安全性差
WebMvcConfigurer中大型单体应用统一管理、灵活配置需要重启生效
CorsFilter需要底层控制完全控制、动态能力强实现复杂中高
Spring Security集成安全敏感应用与认证无缝集成配置复杂
ResponseEntity控制特殊业务需求完全动态控制代码冗余
Spring Cloud Gateway微服务架构统一入口、集中管理单点故障风险
Nginx配置已有Nginx层基础设施解耦运维成本高
WebFlux响应式应用非阻塞处理学习曲线陡峭
Actuator特殊处理监控端点安全隔离额外配置
混合部署方案前后端混合针对性配置复杂度高

选型建议

  • 新项目启动:优先使用WebMvcConfigurer全局配置,保持项目一致性
  • 微服务架构:采用Spring Cloud Gateway统一管理,配合各服务的细粒度配置
  • 高安全要求:结合Spring Security配置,实施分层防御策略
  • 特殊业务场景:在网关层基础配置上,使用@CrossOrigin进行接口级微调

深度避坑指南:跨域处理的12个常见陷阱

1.通配符滥用风险

  • 错误做法:allowedOrigins("*") + allowCredentials(true)
  • 正确方案:生产环境必须指定具体域名,或使用allowedOriginPatterns有限通配

2.预检请求缓存失效

  • 现象:频繁OPTIONS请求增加网络开销
  • 解决:合理设置maxAge(推荐3600秒以上)

3.Vary头缺失问题

  • 影响:可能导致CDN缓存污染
  • 修复:添加Vary: Origin响应头

4.带凭证请求配置错误

  • 关键点:allowCredentials(true)时不能使用*作为源
  • 正确示例:.allowCredentials(true).allowedOrigins("https://exact.domain.com")

5.网关与服务配置冲突

  • 典型症状:CORS头重复设置或被覆盖
  • 解决方案:明确分层,网关做基础配置,服务层做业务相关配置

6.特殊头信息暴露不足

  • 问题现象:前端无法获取自定义头
  • 修复方法:配置exposedHeaders("X-Custom-Header")

7.Spring Security顺序问题

  • 错误表现:CORS配置不生效
  • 关键配置:确保http.cors()在安全过滤器链早期调用

8.HTTP方法遗漏

  • 常见错误:忘记配置OPTIONS方法
  • 完整设置:allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")

9.非简单请求头缺失

  • 问题场景:Content-Type不是application/x-www-form-urlencoded
  • 解决方案:添加allowedHeaders("Content-Type")

10.本地开发环境配置

  • 痛点:多开发者环境域名不统一
  • 技巧:使用allowedOriginPatterns("http://*.local.dev")

11.微服务链路透传问题

  • 现象:网关通过但服务间调用失败
  • 方案:确保Zuul或Spring Cloud Gateway正确转发Origin头

12.浏览器缓存顽固问题

  • 调试技巧:Chrome开发者工具禁用缓存(Network → Disable cache)
  • 强制更新:修改API路径或添加版本参数

高阶应用场景解析

场景1:多租户SaaS应用的动态跨域

// 基于租户标识的动态CORS配置
public class TenantAwareCorsFilter implements Filter {
    
    @Autowired
    private TenantConfigRepository configRepo;
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
        throws IOException, ServletException {
        
        HttpServletRequest request = (HttpServletRequest) req;
        String tenantId = extractTenantId(request);
        TenantConfig config = configRepo.findByTenantId(tenantId);
        
        if (config != null) {
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", config.getAllowedOrigin());
            // 其他动态配置...
        }
        
        chain.doFilter(req, res);
    }
}

场景2:移动端与Web端的差异化配置

@Configuration
public class ClientSpecificCorsConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 移动端API配置
        registry.addMapping("/api/mobile/**")
            .allowedOrigins("https://mobile-app.example.com")
            .allowedMethods("GET", "POST")
            .exposedHeaders("X-App-Version");
            
        // Web端API配置
        registry.addMapping("/api/web/**")
            .allowedOrigins("https://portal.example.com")
            .allowCredentials(true)
            .maxAge(86400);
    }
}

场景3:灰度发布环境特殊处理

@RestController
@RequestMapping("/canary")
public class CanaryApiController {
    
    @GetMapping("/feature")
    public ResponseEntity<?> getFeature(
            @RequestHeader("Origin") String origin,
            @RequestParam String version) {
        
        HttpHeaders headers = new HttpHeaders();
        if ("v2".equals(version) && origin.endsWith(".beta.example.com")) {
            headers.setAccessControlAllowOrigin(origin);
        } else {
            headers.setAccessControlAllowOrigin("https://prod.example.com");
        }
        
        return ResponseEntity.ok()
            .headers(headers)
            .body(canaryService.getFeature(version));
    }
}

性能优化专项建议

预检请求缓存策略

  • 静态资源:设置较长maxAge(如86400秒)
  • 动态API:根据变更频率设置(建议1800-3600秒)
  • 关键路径:对/login等重要接口适当缩短缓存时间

Nginx层优化技巧

map $http_origin $cors_header {
    default "";
    "~^https://(.*\.)?example\.com$" "$http_origin";
}

server {
    # 使用变量减少配置重复
    add_header 'Access-Control-Allow-Origin' $cors_header always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
    add_header 'Access-Control-Max-Age' '86400' always;
}

网关层熔断配置

spring:
  cloud:
    gateway:
      default-filters:
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 100
            redis-rate-limiter.burstCapacity: 200
        - name: CircuitBreaker
          args:
            name: corsFallback
            fallbackUri: forward:/fallback/cors

安全加固专业方案

Origin验证增强

public class OriginValidator {
    private static final Pattern DOMAIN_PATTERN = 
        Pattern.compile("^https://([a-z0-9]+[.])*example[.]com$");
    
    public static boolean isValid(String origin) {
        return origin != null && DOMAIN_PATTERN.matcher(origin).matches();
    }
}

CSRF与CORS协调防御

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors().configurationSource(corsConfigurationSource()).and()
            .csrf(csrf -> csrf
                .ignoringAntMatchers("/api/public/**")
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
            .authorizeRequests()
            // 其他配置...
    }
}

安全头信息增强

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .headers(headers -> headers
            .contentSecurityPolicy(csp -> csp
                .policyDirectives("default-src 'self'; script-src 'self' https://trusted.cdn.com"))
            .frameOptions().sameOrigin()
            .httpStrictTransportSecurity()
                .includeSubDomains(true)
                .maxAgeInSeconds(31536000))
        // 其他配置...
    return http.build();
}

未来演进:HTTP/3与CORS新特性前瞻

Origin-Policy提案

  • 替代部分CORS场景的新标准
  • 服务端声明资源可被哪些源访问
  • 减少预检请求开销

WebTransport协议影响

  • 基于QUIC的新传输协议
  • 可能改变跨域资源共享模式
  • 需要关注新的安全约束

隐私沙盒相关变更

  • SameSite Cookie默认策略变化
  • 对带凭证请求的影响
  • 跨站追踪防护措施

结语:构建面向未来的跨域策略

Spring Boot跨域处理绝非简单的技术选型问题,而是需要综合考虑架构风格、安全要求、性能需求和团队能力等多个维度。通过本文介绍的10种方案及其组合应用,开发者可以:

  • 为单体应用选择恰当的跨域策略组合
  • 在微服务架构中实现分层的跨域控制
  • 根据业务特点实施动态跨域规则
  • 规避常见的配置陷阱和安全风险

建议读者:

  • 建立跨域配置的标准化文档
  • 将CORS测试纳入CI/CD流水线
  • 定期审计生产环境跨域规则
  • 关注W3C相关规范的演进

记住:良好的跨域策略应该是安全性与可用性的平衡,既要保障系统安全,又要为合法请求提供顺畅访问。随着Web技术的不断发展,跨域处理方案也将持续演进,开发者需要保持学习,及时更新技术方案。

以上就是从@CrossOrigin到Gateway详解Spring Boot跨域处理的10种姿势的详细内容,更多关于Spring Boot跨域处理的资料请关注脚本之家其它相关文章!

相关文章

  • 一文详解Java中字符串的基本操作

    一文详解Java中字符串的基本操作

    这篇文章主要为大家详细介绍了Java中字符串的基本操作,例如遍历、统计次数,拼接和反转等以及String的常用方法,感兴趣的可以了解一下
    2022-08-08
  • 深入理解SpringBoot中关于Mybatis使用方法

    深入理解SpringBoot中关于Mybatis使用方法

    这篇文章主要介绍了SpringBoot中关于Mybatis使用方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-03-03
  • Mybatis打印SQL语句的几种常用方式

    Mybatis打印SQL语句的几种常用方式

    当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql就会非常的难,这个时候经常会需要把组合之后的完整SQL语句打印出来,对调试非常有帮助的,所以本文小编给大家介绍了几种Mybatis打印SQL语句的常用方式,需要的朋友可以参考下
    2023-11-11
  • SpringCloud Eureka 服务注册实现过程

    SpringCloud Eureka 服务注册实现过程

    这篇文章主要介绍了SpringCloud Eureka 服务注册实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 详解JVM类加载机制及类缓存问题的处理方法

    详解JVM类加载机制及类缓存问题的处理方法

    这篇文章主要给大家介绍了关于JVM类加载机制及类缓存问题的处理方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • WebFlux 服务编排使用优势详解

    WebFlux 服务编排使用优势详解

    这篇文章主要为大家介绍了WebFlux 服务编排使用优势示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 基于Restful接口调用方法总结(超详细)

    基于Restful接口调用方法总结(超详细)

    下面小编就为大家带来一篇基于Restful接口调用方法总结(超详细)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • MyBatis测试报错:Cannot determine value type from string 'xxx'的解决办法

    MyBatis测试报错:Cannot determine value type from string &a

    这篇文章主要给大家介绍了关于MyBatis测试报错:Cannot determine value type from string 'xxx'的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Java多线程实现多人聊天室功能

    Java多线程实现多人聊天室功能

    这篇文章主要为大家详细介绍了Java多线程实现多人聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • SpringCloud Zuul过滤器和谷歌Gauva实现限流

    SpringCloud Zuul过滤器和谷歌Gauva实现限流

    这篇文章主要介绍了SpringCloud Zuul过滤器和谷歌Gauva实现限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论