您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何解決AJAX訪問(wèn)SpringBoot2.0時(shí)的跨域問(wèn)題,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、關(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è)資訊頻道。
免責(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)容。