SSM(六)跨域傳輸

logo

前言

不知大家在平時(shí)的開(kāi)發(fā)過(guò)程中有沒(méi)有遇到過(guò)跨域訪問(wèn)資源的問(wèn)題驳规,我不巧在上周就碰到一個(gè)這樣的問(wèn)題惑折,幸運(yùn)的是在公司前端同學(xué)的幫忙下解決了該問(wèn)題术裸。

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

  1. 只要協(xié)議停团、域名、端口有任何一個(gè)不同掏熬,都被當(dāng)作是不同的域
  2. 只要是在不同域中是無(wú)法進(jìn)行通信的佑稠。

基于以上的的出發(fā)點(diǎn),我們又有跨域共享資源的需求(譬如現(xiàn)在流行的前后端分離之后分別部署的情況)孽江,本文所采用的解決辦法是JSONP讶坯,說(shuō)到JSONP就會(huì)首先想到JSON。雖然只有一字之差但意義卻完全不一樣岗屏,首先科普一下JSON辆琅。

JSON

其實(shí)現(xiàn)在JSON已經(jīng)是相當(dāng)流行了,只要涉及到前后端的數(shù)據(jù)交互大都都是采用的JSON(不管是web還是android和IOS)这刷,所以我這里就舉一個(gè)例子婉烟,就算是沒(méi)有用過(guò)的同學(xué)也能很快明白其中的意思。

PostMan

首先給大家安利一款后端開(kāi)發(fā)的利器PostMan,可以用于模擬幾乎所有的HTTP請(qǐng)求暇屋,在開(kāi)發(fā)階段調(diào)試后端接口非常有用似袁。
這是一個(gè)Chrome插件,可以直接在google商店搜索直接下載(當(dāng)然前提你懂得)。
之后界面就如下:

2
昙衅。
界面非常簡(jiǎn)潔扬霜,有點(diǎn)開(kāi)發(fā)經(jīng)驗(yàn)的童鞋應(yīng)該都會(huì)使用,不太會(huì)用的直接google下就可以了比較簡(jiǎn)單而涉。
接著我們就可以利用PostMan來(lái)發(fā)起一次請(qǐng)求獲取JSON了著瓶。這里以我SSM項(xiàng)目為例,也正好有暴露一個(gè)JSON的接口。地址如下:
http://www.crossoverjie.top/SSM/content_load啼县。
直接在POSTMAN中的地址欄輸入該地址材原,采用GET的方式請(qǐng)求,之后所返回的就是JSON格式的字符串季眷。
由于Javascript原生的就支持JSON余蟹,所以解析起來(lái)非常方便。

JSONP

好了子刮,終于可以談?wù)?code>JSONP了威酒。之前說(shuō)道JSONP是用來(lái)解決跨域問(wèn)題的,那么他是如何解決的呢话告。
經(jīng)過(guò)我們開(kāi)發(fā)界的前輩們發(fā)現(xiàn)兼搏,HTML中擁有SRC屬性的標(biāo)簽都不受跨域的影響卵慰,比如:<script>沙郭、<img>、<iframe>標(biāo)簽裳朋。
由于JS原生支持JSON的解析病线,于是我們采用<script>的方式來(lái)處理跨域解析,代碼如下一看就明白鲤嫡。
web端:

<html lang="zh">
<head>
    <script type="text/javascript">
        $(document).ready(function(){
            $.ajax({
                type: "get",
                async: false,
                url: "http://www.crossoverjie.top/SSM/jsonpInfo?callback=getUser&userId=3",
                dataType: "jsonp",
                jsonp: "callback",//一般默認(rèn)為:callback
                jsonpCallback:"getUser",//自定義的jsonp回調(diào)函數(shù)名稱送挑,默認(rèn)為jQuery自動(dòng)生成的隨機(jī)函數(shù)名,也可以寫"?"暖眼,jQuery會(huì)自動(dòng)為你處理數(shù)據(jù)
                success: function(json){
                    /**
                     * 獲得服務(wù)器返回的信息惕耕。
                     * 可以做具體的業(yè)務(wù)處理。
                     */
                    alert('用戶信息:ID: ' + json.userId + ' 诫肠,姓名: ' + json.username + '司澎。');
                },
                error: function(){
                    alert('fail');
                }
            });
        });
    </script>

</head>

<body oncontextmenu="return false">

</body>

</html>

其中我們采用了JQuery給我封裝好的函數(shù),這樣就可以自動(dòng)幫我們解析了栋豫。
首先我們來(lái)看下代碼中的http://www.crossoverjie.top/SSM/jsonpInfo?callback=getUser&userId=3這個(gè)地址返回的是什么內(nèi)容挤安,還是放到POSTMAN中執(zhí)行如下:

3

可以看到我們所傳遞的callback參數(shù)帶著查詢的數(shù)據(jù)又原封不動(dòng)的返回給我們了丧鸯,這樣的話即使我們不使用JQuery給我封裝好的函數(shù)蛤铜,我們自定義一個(gè)和callback名稱一樣的函數(shù)一樣是可以解析其中的數(shù)據(jù)的,只是Jquery幫我們做了而已。

前端沒(méi)問(wèn)題了围肥,那么后端又是如何實(shí)現(xiàn)的呢剿干?也很簡(jiǎn)單,如下:

    @RequestMapping(value = "/jsonpInfo",method = { RequestMethod.GET })
    @ResponseBody
    public Object jsonpInfo(String callback,Integer userId) throws IOException {
        User user = userService.getUserById(userId);
        JSONPObject jsonpObject = new JSONPObject(callback,user) ;
        return jsonpObject ;
    }

后端采用了jackson中的JSONPObject這個(gè)類的一個(gè)構(gòu)造方法穆刻,只需要將callback字段和需要轉(zhuǎn)成JSON字符串的對(duì)象放進(jìn)去即可怨愤。
需要主要的是需要使用@ResponseBody注解才能成功返回。

總結(jié)

其實(shí)網(wǎng)上還有其他的方法來(lái)處理跨域問(wèn)題蛹批,不過(guò)我覺(jué)得這樣的方式最為簡(jiǎn)單撰洗。同樣JSONP也是有缺點(diǎn)的,比如:只支持GET方式的HTTP請(qǐng)求腐芍。
以上代碼依然在博主的SSM項(xiàng)目中差导,如有需要可以直接FORK

項(xiàng)目地址:https://github.com/crossoverJie/SSM.git
個(gè)人博客地址:http://crossoverjie.top猪勇。
GitHub地址:https://github.com/crossoverJie设褐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泣刹,隨后出現(xiàn)的幾起案子助析,更是在濱河造成了極大的恐慌,老刑警劉巖椅您,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外冀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掀泳,警方通過(guò)查閱死者的電腦和手機(jī)雪隧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)员舵,“玉大人脑沿,你說(shuō)我怎么就攤上這事÷砥В” “怎么了庄拇?”我有些...
    開(kāi)封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)韭邓。 經(jīng)常有香客問(wèn)我措近,道長(zhǎng),這世上最難降的妖魔是什么仍秤? 我笑而不...
    開(kāi)封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任熄诡,我火速辦了婚禮,結(jié)果婚禮上诗力,老公的妹妹穿的比我還像新娘凰浮。我一直安慰自己我抠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布袜茧。 她就那樣靜靜地躺著菜拓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笛厦。 梳的紋絲不亂的頭發(fā)上纳鼎,一...
    開(kāi)封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音裳凸,去河邊找鬼贱鄙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姨谷,可吹牛的內(nèi)容都是我干的逗宁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梦湘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞎颗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捌议,我...
    開(kāi)封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哼拔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瓣颅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體倦逐,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年弄捕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僻孝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡守谓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出您单,到底是詐尸還是另有隱情斋荞,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布虐秦,位于F島的核電站平酿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悦陋。R本人自食惡果不足惜蜈彼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俺驶。 院中可真熱鬧幸逆,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拍顷,卻和暖如春抚太,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昔案。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工尿贫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人踏揣。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓帅霜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呼伸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子身冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 前言 今天遇到ajax跨域請(qǐng)求的問(wèn)題,在此感謝crossoverJie的文章,幫忙下解決了該問(wèn)題.同時(shí)也接觸到了簡(jiǎn)...
    額嗬閱讀 1,517評(píng)論 0 0
  • JavaScript是一種在Web開(kāi)發(fā)中經(jīng)常使用的前端動(dòng)態(tài)腳本技術(shù)。在JavaScript中括享,有一個(gè)很重要的...
    西瓜w閱讀 1,763評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理搂根,服務(wù)發(fā)現(xiàn),斷路器铃辖,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • 0. 前言 說(shuō)到AJAX就會(huì)不可避免的面臨兩個(gè)問(wèn)題剩愧。 AJAX以何種格式來(lái)交換數(shù)據(jù)? 第二個(gè)是跨域的需求如何解決娇斩?...
    公子七閱讀 23,597評(píng)論 7 67
  • 大家都說(shuō)仁卷,兩個(gè)人在一起并不容易 需要磨合彼此的棱角 還要懂得很多說(shuō)話的藝術(shù) 比如:別總說(shuō)對(duì)方的缺點(diǎn)、說(shuō)話注意態(tài)度犬第、...
    猴子本是王閱讀 465評(píng)論 0 0