SpringBoot - 解決跨域請求問題(No 'Access-Control-Allow-Origin' header is...)


  在開發前后端分離的項目時,常常會碰到跨域請求的問題。即由於瀏覽器的安全性限制,不允許 AJAX 訪問協議不同、域名不同、端口號不同的數據接口,否則會出報 No 'Access-Control-Allow-Origin' header is present on the requested resource. 錯誤。

 

Spring Boot 支持通過設置 CORS(跨源資源共享)來解決跨域請求問題。具體如下兩個地方可以進行配置,我們選擇一種即可。

1,在請求方法上配置

(1)我們可以直接在相應的請求方法上添加 @CrossOrigin 注解,那么該方法則支持跨域。

@RestController
public class WebAPIController {
    @Autowired
    DeviceDataManager deviceDataManager;
 
    @GetMapping("/getDeviceDatas")
    @CrossOrigin
    public List<DeviceData> getDeviceDatas() {
        return deviceDataManager.getDatas();
    }
}

(2)我們也可以在控制器上添加 @CrossOrigin 注解,那么該控制器下的所有方法都支持跨域。

@RestController
@CrossOrigin
public class WebAPIController {
    @Autowired
    DeviceDataManager deviceDataManager;
 
    @GetMapping("/getDeviceDatas")
    public List<DeviceData> getDeviceDatas() {
        return deviceDataManager.getDatas();
    }
}

(3)@CrossOrigin 注解還支持更加豐富的參數配置:

value:表示支持的域。這里表示來自 http://localhost:8081 域的請求是支持跨域的。默認為 *,表示所有域都可以。
maxAge:表示探測請求的有效期(先進性判斷是否有效)。探測請求不用每次都發送,可以配置一個有效期,有效期過了之后才會發送探測請求。默認為 1800 秒,即 30 分鍾。
allowedHeaders:表示允許的請求頭。默認為 *,表示該域中的所有的請求都被允許。
@RestController
public class WebAPIController {
    @Autowired
    DeviceDataManager deviceDataManager;
 
    @GetMapping("/getDeviceDatas")
    @CrossOrigin(value = "http://localhost:8081", maxAge = 1800, allowedHeaders ="*")
    public List<DeviceData> getDeviceDatas() {
        return deviceDataManager.getDatas();
    }
}

2,采用全局配置

(1)全局配置需要添加自定義類實現 WebMvcConfigurer 接口,然后實現接口中的 addCorsMappings 方法。下面是一個簡單的樣例代碼:

addMapping:表示對哪種格式的請求路徑進行跨域處理。
allowedHeaders:表示允許的請求頭,默認允許所有的請求頭信息。
allowedMethods:表示允許的請求方法,默認是 GET、POST 和 HEAD。這里配置為 * 表示支持所有的請求方法。
maxAge:表示探測請求的有效期
allowedOrigins 表示支持的域
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/device/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(1800)
                .allowedOrigins("http://localhost:8081");
    }
}

(2)我們也可以采用如下配置,直接讓所有請求、所有域都支持跨域:

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(1800)
                .allowedOrigins("*");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM