跨域請求傳遞Cookie問題

參考:https://www.cnblogs.com/nuccch/p/7875189.html

  • 問題描述
    前后端完全分離的項目日麸,前端使用Vue + axios衔瓮,后端使用SpringMVC庙洼,容器為Tomcat。
    使用CORS協(xié)議解決跨域訪問數(shù)據(jù)限制的問題祝拯,但是發(fā)現(xiàn)客戶端的Ajax請求不會自動帶上服務(wù)器返回的Cookie:JSESSIONID您没。
    導(dǎo)致每一個Ajax請求在服務(wù)端看來都是一個新的請求,都會在服務(wù)端創(chuàng)建新的Session(在響應(yīng)消息頭中設(shè)置Set-Cookie:JSESSIONID=xxx)扣草。
    而在項目中使用了Shiro框架了牛,用戶認(rèn)證信息是放在Session中的,由于客戶端不會把JSESSIONID返回給服務(wù)器端辰妙,因此使用Session策略存放數(shù)據(jù)的方式不可用鹰祸。

  • 原因分析
    實際上,這是瀏覽器的同源策略導(dǎo)致的問題:不允許JS訪問跨域的Cookie密浑。
    舉個例子蛙婴,現(xiàn)有網(wǎng)站A使用域名a.example.com,網(wǎng)站B使用域名b.example.com尔破,如果希望在2個網(wǎng)站之間共享Cookie(瀏覽器可以將Cookie發(fā)送給服務(wù)器)敬锐,那么在設(shè)置的Cookie的時候,必須設(shè)置domain為example.com呆瞻。

  • 解決方案
    需要從2個方面解決:
    1.服務(wù)器端使用CROS協(xié)議解決跨域訪問數(shù)據(jù)問題時台夺,需要設(shè)置響應(yīng)消息頭Access-Control-Allow-Credentials值為“true”。
    同時痴脾,還需要設(shè)置響應(yīng)消息頭Access-Control-Allow-Origin值為指定單一域名(注:不能為通配符“*”)颤介。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest)request;
    HttpServletResponse resp = (HttpServletResponse)response;
    
    String origin = req.getHeader("Origin");
    if(origin == null) {
        origin = req.getHeader("Referer");
    }
    resp.setHeader("Access-Control-Allow-Origin", origin);            // 允許指定域訪問跨域資源
    resp.setHeader("Access-Control-Allow-Credentials", "true");       // 允許客戶端攜帶跨域cookie,此時origin值不能為“*”,只能為指定單一域名
    
    if(RequestMethod.OPTIONS.toString().equals(req.getMethod())) {
        String allowMethod = req.getHeader("Access-Control-Request-Method");
        String allowHeaders = req.getHeader("Access-Control-Request-Headers");
        resp.setHeader("Access-Control-Max-Age", "86400");            // 瀏覽器緩存預(yù)檢請求結(jié)果時間,單位:秒
        resp.setHeader("Access-Control-Allow-Methods", allowMethod);  // 允許瀏覽器在預(yù)檢請求成功之后發(fā)送的實際請求方法名
        resp.setHeader("Access-Control-Allow-Headers", allowHeaders); // 允許瀏覽器發(fā)送的請求消息頭
        return;
    }

    chain.doFilter(request, response);
}

2.客戶端需要設(shè)置Ajax請求屬性withCredentials=true滚朵,讓Ajax請求都帶上Cookie冤灾。
對于XMLHttpRequest的Ajax請求

var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.withCredentials = true; // 攜帶跨域cookie
xhr.send();
// 對于JQuery的Ajax請求
$.ajax({
    type: "GET",
    url: url,
    xhrFields: {
        withCredentials: true // 攜帶跨域cookie
    },
    processData: false,
    success: function(data) {
        console.log(data);  
    }
});

3.對于axios的Ajax請求
axios.defaults.withCredentials=true; // 讓ajax攜帶cookie

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辕近,隨后出現(xiàn)的幾起案子韵吨,更是在濱河造成了極大的恐慌,老刑警劉巖移宅,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件归粉,死亡現(xiàn)場離奇詭異,居然都是意外死亡漏峰,警方通過查閱死者的電腦和手機(jī)糠悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浅乔,“玉大人倔喂,你說我怎么就攤上這事【肝” “怎么了席噩?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贤壁。 經(jīng)常有香客問我班挖,道長,這世上最難降的妖魔是什么芯砸? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮给梅,結(jié)果婚禮上假丧,老公的妹妹穿的比我還像新娘。我一直安慰自己动羽,他們只是感情好包帚,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著运吓,像睡著了一般渴邦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拘哨,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天谋梭,我揣著相機(jī)與錄音,去河邊找鬼倦青。 笑死瓮床,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隘庄,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼踢步,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丑掺?” 一聲冷哼從身側(cè)響起获印,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎街州,沒想到半個月后兼丰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡菇肃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年地粪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琐谤。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蟆技,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斗忌,到底是詐尸還是另有隱情质礼,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布织阳,位于F島的核電站眶蕉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唧躲。R本人自食惡果不足惜造挽,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄痹。 院中可真熱鬧饭入,春花似錦、人聲如沸肛真。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚓让。三九已至乾忱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間历极,已是汗流浹背窄瘟。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留趟卸,地道東北人寞肖。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓纲酗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親新蟆。 傳聞我的和親對象是個殘疾皇子觅赊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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

  • 會話(Session)跟蹤是Web程序中常用的技術(shù),用來跟蹤用戶的整個會話琼稻。常用的會話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,620評論 1 49
  • 1. cookie 1.1 什么是cookie cookie 是存儲于訪問者的計算機(jī)中的變量吮螺。每當(dāng)同一臺計算機(jī)通過...
    cbw100閱讀 4,060評論 0 13
  • http協(xié)議有http0.9,http1.0帕翻,http1.1和http2三個版本鸠补,但是現(xiàn)在瀏覽器使用的是htt...
    一現(xiàn)_閱讀 1,865評論 0 3
  • 陽光透過密密麻麻的樹葉,慵懶的照耀在水泥地上嘀掸,層層疊疊的葉影紫岩,我看著坐在陰涼處的那抹身影,心不禁的跳動睬塌。我漸漸的抬...
    喇叭_0955閱讀 182評論 0 0
  • 前端發(fā)展史 WEB系統(tǒng) 前端工程師 工作職責(zé) 工作技能
    LuckyPandaLee閱讀 1,309評論 0 6