欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot解決ajax+自定義headers的跨域請(qǐng)求問(wèn)題

 更新時(shí)間:2019年05月28日 11:30:15   作者:Java知音*  
由于瀏覽器同源策略(同源策略,它是由Netscape提出的一個(gè)著名的安全策略,現(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略。接下來(lái)通過(guò)本文給大家介紹Springboot如何優(yōu)雅的解決ajax+自定義headers的跨域請(qǐng)求 ,需要的朋友可以參考下

1、什么是跨域

由于瀏覽器同源策略(同源策略,它是由Netscape提出的一個(gè)著名的安全策略?,F(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略。所謂同源是指,域名,協(xié)議,端口相同。),凡是發(fā)送請(qǐng)求url的協(xié)議、域名、端口三者之間任意一與當(dāng)前頁(yè)面地址不同即為跨域。

具體可以查看下表:

2、springboot如何解決跨域問(wèn)題

1.普通跨域請(qǐng)求解決方案:

①請(qǐng)求接口添加注解@CrossOrigin(origins = "

說(shuō)明:origins = "

②通用配置(所有接口都允許跨域請(qǐng)求)

新增一個(gè)configration類 或 在Application中加入CorsFilter和CorsConfiguration方法

@Configuration 
public class CorsConfig { 
  private CorsConfiguration buildConfig() { 
    CorsConfiguration corsConfiguration = new CorsConfiguration(); 
    corsConfiguration.addAllowedOrigin("*"); // 1允許任何域名使用
    corsConfiguration.addAllowedHeader("*"); // 2允許任何頭
    corsConfiguration.addAllowedMethod("*"); // 3允許任何方法(post、get等) 
    return corsConfiguration; 
  } 

  @Bean 
  public CorsFilter corsFilter() { 
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
    source.registerCorsConfiguration("/**", buildConfig()); // 4 
    return new CorsFilter(source); 
  } 
} 

2.ajax自定義headers的跨域請(qǐng)求

$.ajax({
    type:"GET",
    url:"http://localhost:8766/main/currency/sginInState",
    dataType:"JSON",
    data:{
      uid:userId
    },
    beforeSend: function (XMLHttpRequest) {
      XMLHttpRequest.setRequestHeader("Authorization", access_token);
    },
    success:function(res){
      console.log(res.code)
    }
  })

此時(shí)請(qǐng)求http://localhost:8766/main/currency/sginInState接口發(fā)現(xiàn)OPTIONS http://localhost:8766/main/currency/sginInState 500錯(cuò)誤,普通跨域的解決方案已經(jīng)無(wú)法解決這種問(wèn)題,為什么會(huì)出現(xiàn)OPTIONS請(qǐng)求呢?

原因

瀏覽器會(huì)在發(fā)送真正請(qǐng)求之前,先發(fā)送一個(gè)方法為OPTIONS的預(yù)檢請(qǐng)求 Preflighted requests 這個(gè)請(qǐng)求是用來(lái)驗(yàn)證本次請(qǐng)求是否安全的,但是并不是所有請(qǐng)求都會(huì)發(fā)送,需要符合以下條件:

•請(qǐng)求方法不是GET/HEAD/POST
•POST請(qǐng)求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain

•請(qǐng)求設(shè)置了自定義的header字段

對(duì)于管理端的接口,我有對(duì)接口進(jìn)行權(quán)限校驗(yàn),每次請(qǐng)求需要在header中攜帶自定義的字段(token),所以瀏覽器會(huì)多發(fā)送一個(gè)OPTIONS請(qǐng)求去驗(yàn)證此次請(qǐng)求的安全性。

為何OPTIONS請(qǐng)求是500呢?

OPTIONS請(qǐng)求只會(huì)攜帶自定義的字段,并不會(huì)將相應(yīng)的值帶入進(jìn)去,而后臺(tái)校驗(yàn)token字段時(shí) token為NULL,所以驗(yàn)證不通過(guò),拋出了一個(gè)異常。

那么我們現(xiàn)在來(lái)解決這種問(wèn)題:

① spring boot項(xiàng)目application.yml中添加

spring:
mvc:
dispatch-options-request: true

注意:這種解決方案可能在某些情況下并不能解決OPTIONS問(wèn)題,原因可能是環(huán)境問(wèn)題,也可能是復(fù)雜的自定義filter過(guò)濾器配置問(wèn)題等。

②添加過(guò)濾器配置

第一步:手寫(xiě)RequestFilter請(qǐng)求過(guò)濾器配置類此類需要實(shí)現(xiàn)HandlerInterceptor類,HandlerInterceptor類是org.springframework.web.servlet.HandlerInterceptor下的。

具體代碼實(shí)現(xiàn):

@Component
public class RequestFilter implements HandlerInterceptor {
  public boolean preHandler(HttpServletRequest request,HttpServletResponse response,Object handler){
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
    response.setHeader("Access-Control-Max-Age", "86400");
    response.setHeader("Access-Control-Allow-Headers", "Authorization");
    // 如果是OPTIONS請(qǐng)求則結(jié)束
    if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
      response.setStatus(HttpStatus.NO_CONTENT.value());
      return false;
    }
    return true;
  }
}

第二步:手寫(xiě)MyWebConfiguration此類需要繼承WebMvcConfigurationSupport。

注意:WebMvcConfigurationSupport是2.x版本以上的,1.x版本為WebMvcConfigurerAdapter 。

具體代碼實(shí)現(xiàn):

@Component
public class MyWebConfiguration extends WebMvcConfigurationSupport{
  @Resource
  private RequestFilter requestFilter;
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 跨域攔截器
    registry.addInterceptor(requestFilter).addPathPatterns("/**");
  }
}

總結(jié)

以上所述是小編給大家介紹的Springboot解決ajax+自定義headers的跨域請(qǐng)求問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • spring通過(guò)導(dǎo)入jar包和配置xml文件啟動(dòng)的步驟詳解

    spring通過(guò)導(dǎo)入jar包和配置xml文件啟動(dòng)的步驟詳解

    這篇文章主要介紹了spring通過(guò)導(dǎo)入jar包和配置xml文件啟動(dòng),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    下面小編就為大家分享一篇springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • java同步開(kāi)篇入門簡(jiǎn)單介紹

    java同步開(kāi)篇入門簡(jiǎn)單介紹

    java中的CountDownLatch、Semaphore、CyclicBarrier這些類又不屬于鎖,它們和鎖又有很多共同點(diǎn),都是為了協(xié)同多線程的執(zhí)行,都是一種同步器,所以這里就借用同步來(lái)取名字了,也就是“同步系列”的來(lái)源。下面小編來(lái)簡(jiǎn)單介紹下
    2019-05-05
  • Java中使用MinIO的常用操作示例

    Java中使用MinIO的常用操作示例

    這篇文章主要介紹了Java中MinIO的常用操作示例,MinIO 是一款基于Go語(yǔ)言發(fā)開(kāi)的高性能、分布式的對(duì)象存儲(chǔ)系統(tǒng),客戶端支持Java,Net,Python,Javacript, Golang語(yǔ)言,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼(前端部分)

    Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼(前端部分)

    這篇文章主要為大家介紹了如何用Java語(yǔ)言實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的生成(前端部分),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-10-10
  • SpringBoot使用OpenCV示例總結(jié)

    SpringBoot使用OpenCV示例總結(jié)

    這篇文章主要介紹了SpringBoot使用OpenCV示例總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring中@PostConstruct注解的使用講解

    Spring中@PostConstruct注解的使用講解

    這篇文章主要介紹了Spring中@PostConstruct注解的使用講解,被@PostConstruct修飾的方法會(huì)在服務(wù)器加載Servlet的時(shí)候運(yùn)行,并且只會(huì)被服務(wù)器執(zhí)行一次,PostConstruct在構(gòu)造函數(shù)之后執(zhí)行,init()方法之前執(zhí)行,PreDestroy()方法在destroy()方法之后執(zhí)行,需要的朋友可以參考下
    2023-11-11
  • 一文搞懂SpringMVC中@InitBinder注解的使用

    一文搞懂SpringMVC中@InitBinder注解的使用

    @InitBinder方法可以注冊(cè)控制器特定的java.bean.PropertyEditor或Spring Converter和 Formatter組件。本文通過(guò)示例為大家詳細(xì)講講@InitBinder注解的使用,需要的可以參考一下
    2022-06-06
  • Spring中bean標(biāo)簽的用法詳解

    Spring中bean標(biāo)簽的用法詳解

    Bean標(biāo)簽一般用于配置對(duì)象交由Spring?來(lái)創(chuàng)建,這篇文章主要來(lái)和大家詳細(xì)聊聊Spring中bean標(biāo)簽的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • Java如何調(diào)用wsdl的webservice接口

    Java如何調(diào)用wsdl的webservice接口

    這篇文章主要介紹了Java如何調(diào)用wsdl的webservice接口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論