rust actix_web解決跨域問(wèn)題

Rust actix-web框架跨域請(qǐng)求配置

在做Web服務(wù)時(shí)使用的是與主站配置的是fb.net, 另外個(gè)成員列表服務(wù)是m1.fb.net,這會(huì)造成一個(gè)跨域問(wèn)題屯远。在瀏覽器下使用XML Http Request或者fetch發(fā)出一個(gè)HTTP請(qǐng)求苫昌,假如這個(gè)HTTP的協(xié)議颤绕、主機(jī)名或者端口任意一個(gè)與當(dāng)前網(wǎng)頁(yè)地址有不一致時(shí),為了安全瀏覽器會(huì)限制響應(yīng)結(jié)果祟身,通常這類問(wèn)題就是所謂的跨域問(wèn)題奥务。

可以參考:https://segmentfault.com/a/1190000012550346
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS

解決跨域問(wèn)題的方式有很多,比如jsonp月而,iframe等等。但在這里议纯,我使用HTTP協(xié)議里約定的字段來(lái)解決這個(gè)問(wèn)題父款,這也是最干凈完美的解決方案。為了處理有跨域請(qǐng)求的特殊場(chǎng)景瞻凤,HTTP協(xié)議里有一個(gè)特殊的響應(yīng)頭字段Access-Control-Allow-Origin憨攒,意思允許訪問(wèn)的Origin,值可以是通配符*阀参,允許所有肝集,或者寫上一個(gè)具體的Origin值。

actix-web里蛛壳, 我們需要配合actix_cors來(lái)處理關(guān)于跨域請(qǐng)求的配置杏瞻,以下是一個(gè)例子

Cargo.toml

[package]
name = "guser"
version = "1.0.0"
authors = ["Zhiyong <lizhiyong5653@gmail.com>"]
edition = "2021"

[dependencies]
actix-rt = "1.0.0"
actix-web = "2.0.0"
actix-cors = "0.2.0"
futures = "0.3"

main.rs

HttpServer::new(move || {
        let state = AppState { gs: svc.clone() };

        App::new()
            .app_data(web::FormConfig::default().limit(1024 * 16))
            .data(state)
            .wrap(middleware::Compress::new(ContentEncoding::Gzip))
            .wrap(Cors::new()
                .allowed_origin("https://xxx")
                .allowed_origin("http://xxx")
                .allowed_origin("https://xxx")
                .allowed_origin("http://xxx")
                .allowed_origin("http://local.xxx")
                .allowed_origin("https://local.xxx")
                //.send_wildcard()
                .allowed_methods(vec!["GET", "POST", "DELETE", "OPTIONS"])
                .allowed_headers(vec!["Access-Control-Allow-Headers", 
                    "Authorization", "authorization", "X-Requested-With",
                    "Content-Type", "content-type", "Origin", "Client-id",
                    "user-agent", "User-Agent", "Accept", "Referer","referer",
                    "Nonce", "signature", "Timestamp","AppKey","x-super-properties",
                    "X-Super-Properties"])
                .max_age(3600)
                .finish())
            .configure(routes)
    })
    .keep_alive(KeepAlive::Timeout(90))
    //.workers(16)
    .bind(http_addr)
    .and_then(|server| {
        info!("bind server to address {}", http_addr);
        Ok(server)
    })
    .unwrap_or_else(|_err| {
        error!("could not bind server to address {}", http_addr);
        error!("error : {}", _err.to_string());
        exit(-1)
    })
    .run()
    .await
    .expect("Could not run server")

測(cè)試一下

lizhiyong@lizhiyongdeMacBook-Pro ~ % curl -iv -H 'Origin:https://xxx' http://127.0.0.1:80
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.64.1
> Accept: */*
> Origin:https://xxx
> 
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< content-length: 12
content-length: 12
< vary: Origin
vary: Origin
< content-type: text/plain; charset=utf-8
content-type: text/plain; charset=utf-8
< access-control-allow-origin: https://xxx
access-control-allow-origin: https://xxx
< date: Mon, 26 Apr 2021 08:42:03 GMT
date: Mon, 26 Apr 2021 08:42:03 GMT

< 
* Connection #0 to host 127.0.0.1 left intact
Hello world!* Closing connection 0
lizhiyong@lizhiyongdeMacBook-Pro ~ %

如果我們把Origin換成另一個(gè)域名,則會(huì)報(bào)錯(cuò)

lizhiyong@lizhiyongdeMacBook-Pro ~ % curl -iv -H 'Origin: https://www.qttcd.net' http://127.0.0.1:80                                             
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.64.1
> Accept: */*
> Origin: https://www.qttcd.net
> 
< HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
< content-length: 42
content-length: 42
< date: Mon, 26 Apr 2021 08:41:22 GMT
date: Mon, 26 Apr 2021 08:41:22 GMT

< 
* Connection #0 to host 127.0.0.1 left intact
Origin is not allowed to make this request* Closing connection 0
lizhiyong@lizhiyongdeMacBook-Pro ~ % 


400出錯(cuò)了衙荐,提示

Origin is not allowed to make this request

不允許的Origin請(qǐng)求捞挥,另外http和https視為不同的origin,都需要添加支持忧吟。

allowed_origin("http://www.qttc.net")
allowed_origin("https://www.qttc.net")

如果你需要允許所有的Origin砌函,也就是不做限制的話,那么使用*號(hào)做通配符

allowed_origin("*")

通常來(lái)說(shuō)不建議這么干溜族,
當(dāng)然如果有nginx做負(fù)載的話讹俊,也可以在nginx上部署,此時(shí)后端服務(wù)可以不用如此實(shí)現(xiàn)了煌抒,否則可能會(huì)出現(xiàn):


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仍劈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寡壮,更是在濱河造成了極大的恐慌耳奕,老刑警劉巖绑青,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異屋群,居然都是意外死亡闸婴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門芍躏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邪乍,“玉大人,你說(shuō)我怎么就攤上這事对竣”永悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵否纬,是天一觀的道長(zhǎng)吕晌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)临燃,這世上最難降的妖魔是什么睛驳? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮膜廊,結(jié)果婚禮上乏沸,老公的妹妹穿的比我還像新娘。我一直安慰自己爪瓜,他們只是感情好蹬跃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著铆铆,像睡著了一般蝶缀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薄货,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天扼劈,我揣著相機(jī)與錄音,去河邊找鬼菲驴。 笑死荐吵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赊瞬。 我是一名探鬼主播先煎,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巧涧!你這毒婦竟也來(lái)了薯蝎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谤绳,失蹤者是張志新(化名)和其女友劉穎占锯,沒(méi)想到半個(gè)月后袒哥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡消略,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年堡称,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺演。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡却紧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胎撤,到底是詐尸還是另有隱情晓殊,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布伤提,位于F島的核電站巫俺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏肿男。R本人自食惡果不足惜介汹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望次伶。 院中可真熱鬧痴昧,春花似錦稽穆、人聲如沸冠王。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柱彻。三九已至,卻和暖如春餐胀,著一層夾襖步出監(jiān)牢的瞬間哟楷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工否灾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卖擅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓墨技,卻偏偏與公主長(zhǎng)得像惩阶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扣汪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 在ionic項(xiàng)目中断楷,如果你使用ionic serve或者ionic run,并且開(kāi)啟了動(dòng)態(tài)加載(live relo...
    ten5743閱讀 12,609評(píng)論 4 26
  • 只要你做過(guò)前端項(xiàng)目,你就一定聽(tīng)過(guò)跨域崭别。如果跨域都有沒(méi)聽(tīng)說(shuō)過(guò)的冬筒,還說(shuō)自己是做前端的恐锣,那你肯定還停留在十年前的項(xiàng)目吧,...
    木木心丶閱讀 344評(píng)論 0 2
  • 現(xiàn)在開(kāi)發(fā)一個(gè)聊天室舞痰,聊天室客戶端是獨(dú)立在一個(gè)服務(wù)器上土榴,而接口部分是以lumen框架開(kāi)發(fā),想要快速在聊天頁(yè)面初始化的...
    日落之國(guó)閱讀 1,493評(píng)論 0 1
  • 跨域問(wèn)題是開(kāi)發(fā)過(guò)程中一個(gè)比較常見(jiàn)的問(wèn)題匀奏,無(wú)論你是前臺(tái)開(kāi)發(fā)鞭衩,還是后臺(tái)開(kāi)發(fā),可能都處理過(guò)這個(gè)問(wèn)題娃善。本文主要是介紹跨域常...
    杰哥的集思錄閱讀 8,483評(píng)論 1 9
  • 前言 對(duì)于前后端分離的網(wǎng)站設(shè)計(jì)论衍,跨域幾乎是無(wú)法避免的。對(duì)于跨域的解決方案在網(wǎng)上也是一搜一大堆聚磺,眾說(shuō)紛紜坯台,也許說(shuō)的很...
    崐崐閱讀 2,847評(píng)論 0 1