SpringBoot實現配置跨域請求


一、什么是跨域請求?

跨域請求,就是說瀏覽器在執行腳本文件的ajax請求時,腳本文件所在的服務地址和請求的服務地址不一樣。說白了就是ip、網絡協議、端口都一樣的時候,就是同一個域,否則就是跨域。這是由於Netscape提出一個著名的安全策略——同源策略造成的,這是瀏覽器對JavaScript施加的安全限制。是防止外網的腳本惡意攻擊服務器的一種措施。

下面是幾個跨域的例子:

http://www.123.com/index.html 調用 http://www.123.com/server.php (非跨域)

http://www.123.com/index.html 調用 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 調用 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 調用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)

http://www.123.com/index.html 調用 https://www.123.com/server.php (協議不同:http/https,跨域)

請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。

二、SpringBoot工程如何解決跨域問題?

那么如何在SpringBoot中處理跨域問題呢?方法有很多,這里着重講一種——利用@Configuration配置跨域 
代碼實現如下:

/**
 *
 * 設置跨域請求
 */
@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 設置訪問源地址
        corsConfiguration.addAllowedHeader("*"); // 2 設置訪問源請求頭
        corsConfiguration.addAllowedMethod("*"); // 3 設置訪問源請求方法
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig()); // 4 對接口配置跨域設置
        return new CorsFilter(source);
    }
}

“*”代表全部。”**”代表適配所有接口。 
其中addAllowedOrigin(String origin)方法是追加訪問源地址如果不使用”*”(即允許全部訪問源),則可以配置多條訪問源來做控制 
例如:

corsConfiguration.addAllowedOrigin("http://www.aimaonline.cn/"); 
corsConfiguration.addAllowedOrigin("http://test.aimaonline.cn/"); 

查看CorsConfiguration類的官方文檔:

http://docs.spring.io/spring/docs/4.2.x/javadoc-api/org/springframework/web/cors/CorsConfiguration.html#addAllowedOrigin-java.lang.String- 
我們可以找到官方對setAllowedOrigins(List allowedOrigins)和addAllowedOrigin(String origin)方法的介紹。

addAllowedOrigin是追加訪問源地址,而setAllowedOrigins是可以直接設置多條訪問源 
但是有一點請注意,我查看setAllowedOrigins方法源碼時發現,源碼如下:

public void setAllowedOrigins(List<String> allowedOrigins) {
        this.allowedOrigins = allowedOrigins != null?new ArrayList(allowedOrigins):null;
}

根據源碼可以得知,setAllowedOrigins會覆蓋this.allowedOrigins。所以在配置訪問源地址時, 
addAllowedOrigin方法要寫在setAllowedOrigins后面,當然了,一般情況下這兩個方法也不會混着用。

addAllowedHeader、addAllowedMethod、registerCorsConfiguration方法和addAllowedOrigin的源碼差不太多,這里就不一一介紹了。感興趣的朋友可以自行查閱。

三、其他實現跨域請求方法

當然。除了用這種初始化配置的方法設置跨域問題,在官方的文檔中也介紹了其他實現跨域請求的方法:

http://spring.io/blog/2015/06/08/cors-support-in-spring-framework)。

第二種跨域方法:)例如在接口上使用@CrossOrgin注解:

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

對於上述代碼,官方給出如下一段說明:

You can add to your @RequestMapping annotated handler method a @CrossOrigin annotation in order to enable CORS on it (by default @CrossOrigin allows all origins and the HTTP methods specified in the @RequestMapping annotation).

意思就是可以直接在@RequestMapping接口上使用@CrossOrigin實現跨域@CrossOrigin默認允許所有訪問源和訪問方法。

上面是對方法運用注解,還可以這樣:

//@CrossOrigin  表示所有的URL均可訪問此資源
@CrossOrigin(origins = "http://127.0.0.1:8093")//表示只允許這一個url可以跨域訪問這個controller
@RestController
@RequestMapping("/testCorss")
public class CorssOriginController {

    //可以對方法運用該注解
    //@CrossOrigin(origins = "http://127.0.0.1:8093")
    @GetMapping("/getString")
    public String getString(){
        return "跨域成功!";
    }

}

代碼說明:總的來說,@CrossOrigin這個注解用起來很方便,這個可以用在方法上,也可以用在類上。如果你不設置他的value屬性,或者是origins屬性,就默認是可以允許所有的URL/域訪問。

  • value屬性可以設置多個URL。
  • origins屬性也可以設置多個URL。
  • maxAge屬性指定了准備響應前的緩存持續的最大時間。就是探測請求的有效期。
  • allowCredentials屬性表示用戶是否可以發送、處理 cookie。默認為false
  • allowedHeaders 屬性表示允許的請求頭部有哪些。
  • methods 屬性表示允許請求的方法,默認get,post,head。

還有一種方法(第三種跨域方法)是直接對整個Controller進行跨域設置:

@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

這里,可以對@CrossOrigin設置特定的訪問源,而不是使用默認配置。

以上就是對SpringBoot下配實現跨域請求的介紹。下面ref也有其他跨域方法,也寫得不錯,給個參考!!!


ref: 

(20條消息) SpringBoot解決跨域的5種方式_wh柒八九的博客-CSDN博客_springboot解決跨域
http://spring.io/blog/2015/06/08/cors-support-in-spring-framework 


免責聲明!

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



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