溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解決AJAX訪問(wèn)SpringBoot2.0時(shí)的跨域問(wèn)題

發(fā)布時(shí)間:2021-09-29 17:56:50 來(lái)源:億速云 閱讀:146 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何解決AJAX訪問(wèn)SpringBoot2.0時(shí)的跨域問(wèn)題,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

如何解決AJAX訪問(wèn)SpringBoot2.0時(shí)的跨域問(wèn)題

一、關(guān)于跨域介紹

什么是跨域問(wèn)題?

跨域問(wèn)題來(lái)源于JavaScript的"同源策略",即只有 協(xié)議+主機(jī)名+端口號(hào) (如存在)相同,則允許相互訪問(wèn)。也就是說(shuō)JavaScript只能訪問(wèn)和操作自己域下的資源,不能訪問(wèn)和操作其他域下的資源??缬騿?wèn)題是針對(duì)JS和ajax的,html本身沒(méi)有跨域問(wèn)題。

在前后分離的架構(gòu)下,跨域問(wèn)題難免會(huì)遇見(jiàn)比如,站點(diǎn) http://domain-a.com 的某 HTML 頁(yè)面通過(guò)  的 src 請(qǐng)求 http://domain-b.com/image.jpg。網(wǎng)絡(luò)上的許多頁(yè)面都會(huì)加載來(lái)自不同域的CSS樣式表,圖像和腳本等資源。

出于安全原因,瀏覽器限制從腳本內(nèi)發(fā)起的跨源HTTP請(qǐng)求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 這意味著使用這些API的Web應(yīng)用程序只能從加載應(yīng)用程序的同一個(gè)域請(qǐng)求HTTP資源,除非使用CORS頭文件。

跨域的體現(xiàn),在于它的域名不同或者端口不同,但要注意以下的形式為非跨域模式 

http://www.example.com/index.html ==> http://www.example.com/login.html 

二、Spring Boot跨域(@CrossOrigin)

  當(dāng)然這里雖然指SpringBoot但是SpringMVC也是一樣的,要求在Spring4.2及以上的版本

1、@CrossOrigin使用場(chǎng)景要求

jdk1.8+

Spring4.2+

2、@CrossOrigin源碼解析(翻譯參考網(wǎng)絡(luò))

@Target({ ElementType.METHOD, ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface CrossOrigin {

    String[] DEFAULT_ORIGINS = { "*" };

    String[] DEFAULT_ALLOWED_HEADERS = { "*" };

    boolean DEFAULT_ALLOW_CREDENTIALS = true;

    long DEFAULT_MAX_AGE = 1800;

    /**

    * 同origins屬性一樣

    */

    @AliasFor("origins")

    String[] value() default {};

    /**

    * 所有支持域的集合,例如"http://domain1.com"。

    * <p>這些值都顯示在請(qǐng)求頭中的Access-Control-Allow-Origin

    * "*"代表所有域的請(qǐng)求都支持

      * <p>如果沒(méi)有定義,所有請(qǐng)求的域都支持

      * @see #value

      */

    @AliasFor("value")

    String[] origins() default {};

    /**

    * 允許請(qǐng)求頭重的header,默認(rèn)都支持

    */

    String[] allowedHeaders() default {};

    /**

    * 響應(yīng)頭中允許訪問(wèn)的header,默認(rèn)為空

      */

    String[] exposedHeaders() default {};


    /**

    * 請(qǐng)求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。

    * 默認(rèn)支持RequestMapping中設(shè)置的方法

    */

    RequestMethod[] methods() default {};

    /**

    * 是否允許cookie隨請(qǐng)求發(fā)送,使用時(shí)必須指定具體的域

    */

    String allowCredentials() default "";

    /**

    * 預(yù)請(qǐng)求的結(jié)果的有效期,默認(rèn)30分鐘

      */

    long maxAge() default -1;

3、@CrossOrigin使用

  SpringBoot下的請(qǐng)求處理控制器

   //實(shí)現(xiàn)跨域注解

//origin="*"代表所有域名都可訪問(wèn)

//maxAge飛行前響應(yīng)的緩存持續(xù)時(shí)間的最大年齡,簡(jiǎn)單來(lái)說(shuō)就是Cookie的有效期 單位為秒

//若maxAge是負(fù)數(shù),則代表為臨時(shí)Cookie,不會(huì)被持久化,Cookie信息保存在瀏覽器內(nèi)存中,瀏覽器關(guān)閉Cookie就消失

@CrossOrigin(origins = "*",maxAge = 3600)

@RestController

@RequestMapping("/crawler")

public class CrawlerController {

 

@RequestMapping(value = "/fetchGroupMonthCrawlerStat", method =

        RequestMethod.GET, produces = {

"application/json;charSet=UTF-8" })

public String fetchGroupMonthCrawlerStat(HttpServletResponse response, 

        HttpServletRequest request) {

    //處理業(yè)務(wù)邏輯,并返回?cái)?shù)據(jù);

}

}

上述就是小編為大家分享的如何解決AJAX訪問(wèn)SpringBoot2.0時(shí)的跨域問(wèn)題了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI