這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何解決AJAX訪問SpringBoot2.0時的跨域問題,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在成都網(wǎng)站建設(shè)、網(wǎng)站制作過程中,需要針對客戶的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計方向。成都創(chuàng)新互聯(lián)公司還需要根據(jù)客戶的需求進(jìn)行功能模塊的開發(fā)和設(shè)計,包括內(nèi)容管理、前臺展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計和安全保護(hù)等功能。
一、關(guān)于跨域介紹
什么是跨域問題?
跨域問題來源于JavaScript的"同源策略",即只有 協(xié)議+主機(jī)名+端口號 (如存在)相同,則允許相互訪問。也就是說JavaScript只能訪問和操作自己域下的資源,不能訪問和操作其他域下的資源??缬騿栴}是針對JS和ajax的,html本身沒有跨域問題。
在前后分離的架構(gòu)下,跨域問題難免會遇見比如,站點(diǎn) http://domain-a.com 的某 HTML 頁面通過 的 src 請求 http://domain-b.com/image.jpg。網(wǎng)絡(luò)上的許多頁面都會加載來自不同域的CSS樣式表,圖像和腳本等資源。
出于安全原因,瀏覽器限制從腳本內(nèi)發(fā)起的跨源HTTP請求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 這意味著使用這些API的Web應(yīng)用程序只能從加載應(yī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使用場景要求
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"。
*
這些值都顯示在請求頭中的Access-Control-Allow-Origin
* "*"代表所有域的請求都支持
*
如果沒有定義,所有請求的域都支持
* @see #value
*/
@AliasFor("value")
String[] origins() default {};
/**
* 允許請求頭重的header,默認(rèn)都支持
*/
String[] allowedHeaders() default {};
/**
* 響應(yīng)頭中允許訪問的header,默認(rèn)為空
*/
String[] exposedHeaders() default {};
/**
* 請求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。
* 默認(rèn)支持RequestMapping中設(shè)置的方法
*/
RequestMethod[] methods() default {};
/**
* 是否允許cookie隨請求發(fā)送,使用時必須指定具體的域
*/
String allowCredentials() default "";
/**
* 預(yù)請求的結(jié)果的有效期,默認(rèn)30分鐘
*/
long maxAge() default -1;
}
3、@CrossOrigin使用
SpringBoot下的請求處理控制器
//實現(xiàn)跨域注解
//origin="*"代表所有域名都可訪問
//maxAge飛行前響應(yīng)的緩存持續(xù)時間的最大年齡,簡單來說就是Cookie的有效期 單位為秒
//若maxAge是負(fù)數(shù),則代表為臨時Cookie,不會被持久化,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ù)邏輯,并返回數(shù)據(jù);
}
}
上述就是小編為大家分享的如何解決AJAX訪問SpringBoot2.0時的跨域問題了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。