中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot跨域問題的解決方法

發布時間:2021-08-26 16:17:55 來源:億速云 閱讀:128 作者:chen 欄目:編程語言

這篇文章主要講解了“SpringBoot跨域問題的解決方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringBoot跨域問題的解決方法”吧!

什么是跨域?

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

為什么要跨域?

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

SpringBoot解決跨域問題

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

配置實例如下:

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

首先實現了WebMvcConfigurer 接口,WebMvcConfigurer 這個接口十分強大,里面還有很多可用的方法,在SpringBoot2.0里面可以解決WebMvcConfigurerAdapter曾經的部分任務。其中一個方法就是addCorsMappings(),是專門為開發人員解決跨域而誕生的接口。其中構造參數為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 有個屬性registrations ,按道理可以根據不同的項目路徑進行定制訪問行為,但是我們示例直接將pathPattern 設置為 /**,也就是說已覆蓋項目所有路徑,只需要創建一個CorsRegistration就好。getCorsConfigurations(),這個方法是獲取所有CorsConfiguration的Map集合,key值為傳入路徑pathPattern。

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

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

局部配置

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

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @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;}

這個注解可以作用于方法或者類上,實現局部跨域,你會發現除了設置路徑(因為沒必要了,都定位到局部了)其他的參數與全局類似。

小結

SpringBoot可以基于Cors解決跨域問題,可以設置全局跨域,也可以實現局部跨域,靈活配置方便使用。

感謝各位的閱讀,以上就是“SpringBoot跨域問題的解決方法”的內容了,經過本文的學習后,相信大家對SpringBoot跨域問題的解決方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉义市| 泸溪县| 美姑县| 封丘县| 安仁县| 阆中市| 莱州市| 平和县| 耿马| 黑水县| 虞城县| 巴彦县| 新乐市| 五指山市| 独山县| 广平县| 闽清县| 留坝县| 定襄县| 庆安县| 青阳县| 滨海县| 万载县| 江孜县| 南开区| 峨边| 临泽县| 威远县| 奉节县| 闽侯县| 新昌县| 天镇县| 革吉县| 洪江市| 惠州市| 开鲁县| 麻栗坡县| 于都县| 闵行区| 武功县| 潜江市|