Skip to content

跨域问题

跨域问题是Web开发中常见的问题,特别是在使用Ajax进行前后端分离的项目中。由于浏览器的同源策略限制,当Ajax请求的URL与当前页面的协议、域名或端口不同时,就会出现跨域问题。

在Spring Boot项目中,解决跨域问题通常有两种方式:CORS(跨源资源共享)和JSONP。其中,CORS是更现代、更安全的选择,也是Spring Boot推荐的方式。

使用CORS解决跨域问题

1. 在全局配置中添加CORS过滤器

你可以在Spring Boot应用中添加一个全局的CORS过滤器,这样所有进入应用的请求都会被处理:

java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class WebConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 设置允许跨域的域名,"*"表示允许任意域名跨域
        config.addAllowedOrigin("*");
        // 设置允许任何头信息
        config.addAllowedHeader("*");
        // 设置允许的方法
        config.addAllowedMethod("*");
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

2. 使用@CrossOrigin注解

你也可以在Controller类或者方法上使用@CrossOrigin注解来指定哪些请求可以跨域:

java
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @CrossOrigin(origins = "http://example.com")
    @GetMapping("/data")
    public Map<String, Object> getData() {
        // 返回数据
    }
}

注意事项

  • 当使用CORS时,预检请求(OPTIONS方法)可能会发送到服务器,这是为了确定实际请求是否安全。
  • 不要将敏感信息(如身份验证令牌)包含在跨域请求的头部中,除非你已经设置了适当的CORS策略来保护这些信息。
  • 如果你的API需要支持多种来源的请求,考虑将allowedOrigins设置为"*",但这可能增加安全风险,因此在生产环境中应谨慎使用。

通过以上方法,你可以有效地解决Spring Boot应用中的跨域问题。