最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 跨域問題的解決方案

 更新時(shí)間:2019年06月11日 10:24:45   作者:啤酒就辣條  
這篇文章主要介紹了SpringBoot 跨域問題的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

什么是跨域?

定義:瀏覽器從一個(gè)域名的網(wǎng)頁取請求另一個(gè)域名下的東西。通俗點(diǎn)說,瀏覽器直接從A域訪問B域中的資源是不被允許的,如果想要訪問,就需要進(jìn)行一步操作,這操作就叫“跨域”。例如,你從百度的頁面,點(diǎn)擊一個(gè)按鈕,請求了新浪的一個(gè)接口,這就進(jìn)行了跨域。不單單只有域名不同就是跨域,域名、端口、協(xié)議其一不同就是不同的域,請求資源需要跨域。

為什么要跨域?

為什么需要跨域,而不直接訪問其他域下的資源呢?這是瀏覽器的限制,專業(yè)點(diǎn)說叫瀏覽器同源策略限制。主要是為了安全考慮?,F(xiàn)在的安全框架,一般請求的時(shí)候header中不是都存?zhèn)€token嘛,你要是用這個(gè)token去正常訪問A域下的東西是沒問題的,然后又去訪問了B域,結(jié)果陰差陽錯的還帶著這個(gè)token,那么B域,或者說B網(wǎng)站是不是就可以拿著你的token去A域下做點(diǎn)什么呢,這就相當(dāng)危險(xiǎn)了。所以瀏覽器加上了所謂的瀏覽器同源策略限制。但是為了我們真的需要從A域下訪問B的資源(正常訪問),就需要用到跨域,跨越這個(gè)限制了。

SpringBoot解決跨域問題

SpringBoot可以基于Cors解決跨域問題,Cors是一種機(jī)制,告訴我們的后臺,哪邊(origin )來的請求可以訪問服務(wù)器的數(shù)據(jù)。
全局配置

配置實(shí)例如下:

@Configuration
public class CorsConfig implements WebMvcConfigurer {

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
      .allowedOrigins("*")
      .allowCredentials(true)
      .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
      .maxAge(3600);
  }
}

首先實(shí)現(xiàn)了WebMvcConfigurer 接口,WebMvcConfigurer 這個(gè)接口十分強(qiáng)大,里面還有很多可用的方法,在SpringBoot2.0里面可以解決WebMvcConfigurerAdapter曾經(jīng)的部分任務(wù)。其中一個(gè)方法就是addCorsMappings(),是專門為開發(fā)人員解決跨域而誕生的接口。其中構(gòu)造參數(shù)為CorsRegistry。

看下CorsRegistry源碼,十分簡單:

public class CorsRegistry {

  private final List<CorsRegistration> registrations = new ArrayList<>();

  public CorsRegistration addMapping(String pathPattern) {
   CorsRegistration registration = new CorsRegistration(pathPattern);
   this.registrations.add(registration);
   return registration;
  }
  
  protected Map<String, CorsConfiguration> getCorsConfigurations() {
   Map<String, CorsConfiguration> configs = new LinkedHashMap<>(this.registrations.size());
   for (CorsRegistration registration : this.registrations) {
     configs.put(registration.getPathPattern(), registration.getCorsConfiguration());
   }
   return configs;
  }

} 

可以看出CorsRegistry 有個(gè)屬性registrations ,按道理可以根據(jù)不同的項(xiàng)目路徑進(jìn)行定制訪問行為,但是我們示例直接將pathPattern 設(shè)置為 /**,也就是說已覆蓋項(xiàng)目所有路徑,只需要創(chuàng)建一個(gè)CorsRegistration就好。getCorsConfigurations(),這個(gè)方法是獲取所有CorsConfiguration的Map集合,key值為傳入路徑pathPattern。

回到示例代碼CorsConfig中,registry對象addMapping()增加完傳入路徑pathPattern之后,return了一個(gè)CorsRegistration對象,是進(jìn)行更多的配置,看一下CorsRegistration的代碼,看看我們能配些什么?

public class CorsRegistration {
  //傳入的路徑
  private final String pathPattern;
  //配置信息實(shí)體類
  private final CorsConfiguration config;
  //構(gòu)造方法
  public CorsRegistration(String pathPattern) {
   this.pathPattern = pathPattern;
   //原生注釋看到了一個(gè) @CrossOrigin 這個(gè)注解,待會看看是什么
   // Same implicit default values as the @CrossOrigin annotation + allows simple methods
   this.config = new CorsConfiguration().applyPermitDefaultValues();
  }
  //允許哪些源網(wǎng)站訪問,默認(rèn)所有
  public CorsRegistration allowedOrigins(String... origins) {
   this.config.setAllowedOrigins(Arrays.asList(origins));
   return this;
  }
  //允許何種方式訪問,默認(rèn)簡單方式,即:GET,HEAD,POST
  public CorsRegistration allowedMethods(String... methods) {
   this.config.setAllowedMethods(Arrays.asList(methods));
   return this;
  }
  //設(shè)置訪問header,默認(rèn)所有
  public CorsRegistration allowedHeaders(String... headers) {
   this.config.setAllowedHeaders(Arrays.asList(headers));
   return this;
  }
  //設(shè)置response headers,默認(rèn)沒有(什么都不設(shè)置)
  public CorsRegistration exposedHeaders(String... headers) {
   this.config.setExposedHeaders(Arrays.asList(headers));
   return this;
  }
  //是否瀏覽器應(yīng)該發(fā)送credentials,例如cookies Access-Control-Allow-Credentials
  public CorsRegistration allowCredentials(boolean allowCredentials) {
   this.config.setAllowCredentials(allowCredentials);
   return this;
  }
  //設(shè)置等待時(shí)間,默認(rèn)1800秒
  public CorsRegistration maxAge(long maxAge) {
   this.config.setMaxAge(maxAge);
   return this;
  }

  protected String getPathPattern() {
   return this.pathPattern;
  }

  protected CorsConfiguration getCorsConfiguration() {
   return this.config;
  }

}

局部配置

剛才遇到一個(gè)@CrossOrigin這個(gè)注解,看看它是干什么的?

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {

  /** @deprecated as of Spring 5.0, in favor of {@link CorsConfiguration#applyPermitDefaultValues} */
  @Deprecated
  String[] DEFAULT_ORIGINS = { "*" };

  /** @deprecated as of Spring 5.0, in favor of {@link CorsConfiguration#applyPermitDefaultValues} */
  @Deprecated
  String[] DEFAULT_ALLOWED_HEADERS = { "*" };

  /** @deprecated as of Spring 5.0, in favor of {@link CorsConfiguration#applyPermitDefaultValues} */
  @Deprecated
  boolean DEFAULT_ALLOW_CREDENTIALS = false;

  /** @deprecated as of Spring 5.0, in favor of {@link CorsConfiguration#applyPermitDefaultValues} */
  @Deprecated
  long DEFAULT_MAX_AGE = 1800

  /**
  * Alias for {@link #origins}.
  */
  @AliasFor("origins")
  String[] value() default {};

  @AliasFor("value")
  String[] origins() default {};

  String[] allowedHeaders() default {};

  String[] exposedHeaders() default {};

  RequestMethod[] methods() default {};

  String allowCredentials() default "";

  long maxAge() default -1;
}

這個(gè)注解可以作用于方法或者類上,實(shí)現(xiàn)局部跨域,你會發(fā)現(xiàn)除了設(shè)置路徑(因?yàn)闆]必要了,都定位到局部了)其他的參數(shù)與全局類似。

小結(jié)

SpringBoot可以基于Cors解決跨域問題,可以設(shè)置全局跨域,也可以實(shí)現(xiàn)局部跨域,靈活配置方便使用。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring boot中使用RabbitMQ routing路由詳解

    spring boot中使用RabbitMQ routing路由詳解

    本篇文章主要介紹了spring boot中使用RabbitMQ routing路由詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 簡單聊聊RabbitMQ中的隊(duì)頭阻塞問題

    簡單聊聊RabbitMQ中的隊(duì)頭阻塞問題

    這篇文章主要為大家詳細(xì)介紹了RabbitMQ中的隊(duì)頭阻塞問題以及相關(guān)的解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Spring如何在xml文件中配置Bean

    Spring如何在xml文件中配置Bean

    這篇文章主要介紹了Spring如何在xml文件中配置Bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 關(guān)于File與MultipartFile的用法概述

    關(guān)于File與MultipartFile的用法概述

    這篇文章主要介紹了關(guān)于File與MultipartFile的用法概述,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • mybatis中的緩存問題解析

    mybatis中的緩存問題解析

    本篇文章主要介紹了mybatis中的緩存問題解析,詳細(xì)的介紹了關(guān)于mybatis的一級緩存和二級緩存,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-04-04
  • 舉例詳解Java編程中HashMap的初始化以及遍歷的方法

    舉例詳解Java編程中HashMap的初始化以及遍歷的方法

    這篇文章主要介紹了Java編程中HashMap的初始化以及遍歷的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • 在Java中Collection的一些常用方法總結(jié)

    在Java中Collection的一些常用方法總結(jié)

    今天給大家?guī)淼闹R是關(guān)于Java的,文章圍繞著Java中Collection的一些常用方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring中ClassPath指的是哪些地方

    Spring中ClassPath指的是哪些地方

    在Spring應(yīng)用中,ClassPath指的是應(yīng)用程序的類加載路徑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • idea整合deepseek實(shí)現(xiàn)AI輔助編程的流程步驟

    idea整合deepseek實(shí)現(xiàn)AI輔助編程的流程步驟

    文章介紹了如何在IntelliJ IDEA中整合DeepSeek平臺實(shí)現(xiàn)AI輔助編程,步驟包括安裝CodeGPT插件、注冊DeepSeek開發(fā)者賬號、配置API密鑰以及設(shè)置API信息,需要的朋友可以參考下
    2025-02-02
  • Spring Boot應(yīng)用發(fā)布到Docker的實(shí)現(xiàn)

    Spring Boot應(yīng)用發(fā)布到Docker的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot應(yīng)用發(fā)布到Docker的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論

吉木乃县| 安达市| 吴旗县| 湖州市| 广水市| 宣武区| 收藏| 莲花县| 漳州市| 韶关市| 张家界市| 阳西县| 上蔡县| 敦化市| 西乌珠穆沁旗| 敖汉旗| 攀枝花市| 嘉禾县| 福海县| 永川市| 平江县| 桂林市| 林甸县| 横峰县| 遂川县| 古浪县| 云梦县| 汉中市| 吐鲁番市| 金湖县| 昌乐县| 伽师县| 乌拉特前旗| 建水县| 靖宇县| 宣城市| 通海县| 塔城市| 凉城县| 巨鹿县| 卢湾区|