<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot開(kāi)發(fā)秘籍 - 處理跨域請(qǐng)求CORS

          共 6053字,需瀏覽 13分鐘

           ·

          2021-04-23 22:19

          CORS(Cross-Origin Resource Sharing)"跨域資源共享",是一個(gè)W3C標(biāo)準(zhǔn),它允許瀏覽器向跨域服務(wù)器發(fā)送Ajax請(qǐng)求,打破了Ajax只能訪問(wèn)本站內(nèi)的資源限制。

          在前后分離的架構(gòu)下,我們經(jīng)常會(huì)遇到跨域CORS問(wèn)題,在瀏覽器上的表現(xiàn)就是出現(xiàn)如下一段錯(cuò)誤提示:No 'Access-Control-Allow-Origin' header is present on the requested resource.

          下面看一下如何讓你的SpringBoot項(xiàng)目支持CORS跨域。

          SpringBoot處理跨域

          在SpringBoot后端處理跨域比較簡(jiǎn)單,只需要在項(xiàng)目中添加如下一個(gè)配置類即可:

          /**
           * Spring Boot 2.0 解決跨域問(wèn)題
           * @Author javadaily
           */

          @Configuration
          public class WebMvcConfiguration implements WebMvcConfigurer {


           @Bean
           public CorsFilter corsFilter() {
            final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
            final CorsConfiguration corsConfiguration = new CorsConfiguration();
            /* 是否允許請(qǐng)求帶有驗(yàn)證信息 */
            corsConfiguration.setAllowCredentials(true);
            /* 允許訪問(wèn)的客戶端域名 */
            corsConfiguration.addAllowedOrigin("*");
            /* 允許服務(wù)端訪問(wèn)的客戶端請(qǐng)求頭 */
            corsConfiguration.addAllowedHeader("*");
            /* 允許訪問(wèn)的方法名,GET POST等 */
            corsConfiguration.addAllowedMethod("*");
            urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
            return new CorsFilter(urlBasedCorsConfigurationSource);
           }

          }

          這里我們?cè)谂渲妙愔凶⑷肓?CorsFilter并重寫了相關(guān)配置,大家可以根據(jù)自己的業(yè)務(wù)需求請(qǐng)里面的 * 改成具體的屬性值。

          通過(guò)上面的配置我們基本可以解決后端跨域問(wèn)題,但是在一些特定情況下還是還出現(xiàn)跨域。

          特殊情況

          當(dāng)項(xiàng)目中還有一個(gè)自定義過(guò)濾器,并且在過(guò)濾器中通過(guò) response.getWriter().print()直接向客戶端輸出返回信息:

          在這種情況下是不會(huì)繼續(xù)執(zhí)行后面的過(guò)濾器鏈的。

          而在SpringBoot中自定義過(guò)濾器的優(yōu)先級(jí)高于WebMvcConfigurer中定義的過(guò)濾器,所以此時(shí)由于未經(jīng)過(guò)CORS過(guò)濾器的處理還是會(huì)出現(xiàn)跨域現(xiàn)象。

          這種時(shí)候我們就需要改寫CorsFilter的寫法,讓其在自定義過(guò)濾器之前執(zhí)行。

          解決方法

          • 自定義Cors過(guò)濾器
          public class CustomerCorsFilter extends CorsFilter {

              public CustomerCorsFilter() {
                  super(configurationSource());
              }

              private static UrlBasedCorsConfigurationSource configurationSource() {
                  // CORS授權(quán)
                  CorsConfiguration config = new CorsConfiguration();
                  config.setAllowCredentials(true);
                  config.addAllowedOrigin("*");
                  config.addAllowedHeader("*");
                  config.addAllowedMethod("*");
                  config.addExposedHeader(HttpHeaders.SET_COOKIE);
                  config.setMaxAge(3600L);
                  UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
                  source.registerCorsConfiguration("/**", config);
                          return source;
              }

          }


          • 通過(guò)配置類指定過(guò)濾器的優(yōu)先級(jí)
          @Configuration
          public class FilterConfig {

              @Bean
              public Filter authFilter(){
                  return new AuthFilter();
              }


              /**
               * WARNING :跨域過(guò)濾器,注意執(zhí)行順序,必須要在AuthFilter過(guò)濾器之后
               * @return
               */

              @Bean
              public FilterRegistrationBean corsFilterRegistration() {

                  FilterRegistrationBean registration = new FilterRegistrationBean();
                  //添加過(guò)濾器
                  registration.setFilter(new CustomerCorsFilter());
                  List<String> urlList = new ArrayList<>();
                  urlList.add("/*");
                  //設(shè)置過(guò)濾路徑,/*所有路徑
                  registration.setUrlPatterns(urlList);
                  //添加默認(rèn)參數(shù)
                  registration.setName("CorsFilter");
                  //設(shè)置優(yōu)先級(jí)
                  registration.setOrder(-1);
                  return registration;
              }


              @Bean
              public FilterRegistrationBean authFilterRegistration() {

                  FilterRegistrationBean registration = new FilterRegistrationBean();
                  //添加過(guò)濾器
                  registration.setFilter(authFilter());
                  List<String> urlList = new ArrayList<>();
                  urlList.add("/*");
                  //設(shè)置過(guò)濾路徑,/*所有路徑
                  registration.setUrlPatterns(urlList);
                  //添加默認(rèn)參數(shù)
                  registration.setName("authFilter");
                  //設(shè)置優(yōu)先級(jí)
                  registration.setOrder(1);
                  return registration;
              }

          }

          通過(guò)setOrder()方法指定過(guò)濾器的執(zhí)行順序,用以保證CORS過(guò)濾器先入自定義過(guò)濾器執(zhí)行。注意:order的順序越小優(yōu)先級(jí)越高。


          推薦閱讀:

          Kafka原理篇:圖解kakfa架構(gòu)原理

          架構(gòu)設(shè)計(jì)方法論

          從面試角度一文學(xué)完 Kafka

          數(shù)據(jù)庫(kù)跟緩存的雙寫一致性


          關(guān)號(hào)互聯(lián)網(wǎng)全棧架構(gòu)價(jià)

          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧洲无码一区 | 亚洲电影无码 | 日本97色色 | 尤物最新网址 | 青娱乐在线无码视频 |