Spring MVC中跨域问题处理

06-01 1425阅读

在Spring MVC中处理跨域问题可以通过以下几种方式实现,确保前后端能够正常通信:


方法一:使用 @CrossOrigin 注解

适用于局部控制跨域配置,直接在Controller或方法上添加注解。

示例代码:
@RestController
@CrossOrigin(origins = "http://localhost:8080") // 允许指定源
public class MyController {
    @GetMapping("/data")
    public String getData() {
        return "Hello, CORS!";
    }
}
  • 参数说明:
    • origins: 允许的源(多个用逗号分隔,或用 @CrossOrigin(origins = "*") 允许所有,但不推荐生产环境)。
    • methods: 允许的HTTP方法(如 RequestMethod.GET)。
    • allowedHeaders: 允许的请求头。
    • allowCredentials: 是否允许发送Cookie(需与前端配置一致)。

      方法二:全局配置 WebMvcConfigurer

      适用于全局跨域设置,统一管理所有接口的跨域规则。

      步骤:
      1. 创建配置类实现 WebMvcConfigurer。
      2. 重写 addCorsMappings 方法。
      示例代码:
      @Configuration
      public class CorsGlobalConfig implements WebMvcConfigurer {
          @Override
          public void addCorsMappings(CorsRegistry registry) {
              registry.addMapping("/**") // 匹配所有路径
                      .allowedOrigins("http://localhost:8080", "https://example.com")
                      .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                      .allowedHeaders("*")
                      .allowCredentials(true)
                      .maxAge(3600); // 预检请求缓存时间(秒)
          }
      }
      

      方法三:使用 CorsFilter

      通过自定义过滤器精细化控制跨域行为,适合复杂场景。

      示例代码:
      @Configuration
      public class CorsFilterConfig {
          @Bean
          public CorsFilter corsFilter() {
              UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
              CorsConfiguration config = new CorsConfiguration();
              config.setAllowCredentials(true);
              config.addAllowedOrigin("http://localhost:8080");
              config.addAllowedHeader("*");
              config.addAllowedMethod("*");
              source.registerCorsConfiguration("/**", config); // 对所有路径生效
              return new CorsFilter(source);
          }
      }
      

      方法四:结合 Spring Security

      若项目集成了Spring Security,需额外配置安全规则以启用CORS。

      步骤:
      1. 在安全配置类中启用CORS。
      2. 定义 CorsConfigurationSource Bean。
      示例代码:
      @Configuration
      @EnableWebSecurity
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
          @Override
          protected void configure(HttpSecurity http) throws Exception {
              http.cors().and() // 启用CORS
                  .csrf().disable()
                  .authorizeRequests()
                  .anyRequest().authenticated();
          }
          @Bean
          public CorsConfigurationSource corsConfigurationSource() {
              CorsConfiguration config = new CorsConfiguration();
              config.setAllowedOrigins(Arrays.asList("http://localhost:8080"));
              config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
              config.setAllowedHeaders(Arrays.asList("*"));
              config.setAllowCredentials(true);
              UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
              source.registerCorsConfiguration("/**", config);
              return source;
          }
      }
      

      方法五:通过 命名空间配置全局跨域规则

      在 Spring MVC 中,如果项目使用 applicationContext.xml 进行配置(基于 XML 的配置方式),这是最直接的 XML 配置方式,适用于全局跨域设置。

      步骤:
      1. 确保 XML 文件头部声明了 mvc 命名空间:

        
        
      2. 在 标签外配置跨域规则:

         
                   
                
            
            
         	 ...
        	
        
        • 参数说明:
          • path: 匹配的 URL 路径模式(支持 Ant 风格,如 /api/**)。
          • allowed-origins: 允许的源(多个用逗号分隔)。
          • allowed-methods: 允许的 HTTP 方法。
          • allowed-headers: 允许的请求头。
          • allow-credentials: 是否允许发送 Cookie(对应 allowCredentials(true))。
          • max-age: 预检请求缓存时间(秒)。

      方法六:通过自定义 CorsFilter Bean 配置

      通过applicationContext.xml配置处理跨域问题时,如果需要对跨域行为进行更细粒度的控制(例如动态配置),可以手动注册 CorsFilter。

      步骤:
      1. 在 applicationContext.xml 中定义 CorsFilter Bean:

            
                
                    
                        
                            
                                
                                    
                                        
                                            http://localhost:8080
                                            https://example.com
                                        
                                    
                                    
                                        
                                            GET
                                            POST
                                            PUT
                                            DELETE
                                            OPTIONS
                                        
                                    
                                    
                                        
                                            Content-Type
                                            Authorization
                                        
                                    
                                    
                                    
                                
                            
                        
                    
                
            
        
        
      2. 确保 CorsFilter 优先执行:

        在 web.xml 中,将 CorsFilter 注册为第一个 Filter:

            corsFilter
            org.springframework.web.filter.DelegatingFilterProxy
        
        
            corsFilter
            /*
        
        

      完整示例:结合 applicationContext.xml 和 web.xml

      applicationContext.xml 配置:
          
          
              
                  
              
          
      
      
      web.xml 配置(确保 Filter 顺序):
          corsFilter
          org.springframework.web.filter.CorsFilter
      
      
          corsFilter
          /*
      
      

      通过方式五和方式六,可以在基于 XML 的 Spring MVC 项目中灵活配置跨域规则。推荐使用 命名空间配置,简单且直接;若需动态控制,则选择 CorsFilter。

      关键注意事项

      1. 预检请求(Preflight):浏览器会先发送 OPTIONS 请求检查服务器是否允许跨域。确保配置中包含 allowedMethods 并正确处理 OPTIONS。
      2. 携带凭证(Cookies):若需传输Cookies,前端需设置 withCredentials: true,后端需设置 allowCredentials(true),且 allowedOrigins 不能为 *。
      3. 生产环境安全:避免使用通配符 *,应明确指定允许的源、方法和头信息。
      4. allowedOrigins vs allowedOriginPatterns:
        • 如果使用 Spring 5.3+,可以用 allowedOriginPatterns 支持通配符模式(如 http://*.example.com)。
        • XML 配置中需通过 手动指定具体域名。
        • 与 Spring Security 集成:
          • 如果项目集成了 Spring Security,需在安全配置中启用 CORS:
                 
                
            
            

      通过上述方法,可灵活解决Spring MVC中的跨域问题,根据项目需求选择最合适的方案。

      Spring MVC中跨域问题处理
      (图片来源网络,侵删)
      Spring MVC中跨域问题处理
      (图片来源网络,侵删)
      Spring MVC中跨域问题处理
      (图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码