前言:
前面我們一直都是用工具來(lái)測(cè)試的,接下來(lái)我們?cè)陧?yè)面上展示
1.導(dǎo)入靜態(tài)資源
直接復(fù)制黏貼沒(méi)啥好說(shuō)的
配置資源映射
為什么我要配置靜態(tài)資源呢匹涮?
由于web.xml文件當(dāng)中配置的攔截形式是"/",這也就意味著它會(huì)攔截所有的請(qǐng)求槐壳,包括我們的靜態(tài)資源文件然低,我們直接訪問(wèn)的話就會(huì)報(bào)404(找不到資源的錯(cuò)誤),可能有些小白跟我一樣务唐,對(duì)攔截請(qǐng)求不明白雳攘,之所以有攔截器就是為了系統(tǒng)的安全,把一些認(rèn)為不安全的請(qǐng)求給過(guò)濾掉枫笛,以"/"攔截的話會(huì)把所有請(qǐng)求都攔截住吨灭,就是說(shuō),所有的請(qǐng)求都要經(jīng)過(guò)嚴(yán)格的檢查刑巧,如果被攔截下來(lái)的請(qǐng)求在系統(tǒng)中找不到對(duì)應(yīng)的資源或接口來(lái)響應(yīng)的話喧兄,就會(huì)出現(xiàn)404的錯(cuò)誤涩咖。我們見(jiàn)過(guò)以"*.html"為過(guò)濾條件的情景,這種情況下只有".html"結(jié)尾的請(qǐng)求才會(huì)被攔截繁莹,其它請(qǐng)求不會(huì)被攔截。那么小白們可能提出問(wèn)題了特幔,既然所有請(qǐng)求都被攔截了咨演,那么為何我們可以訪問(wèn)Controller中的接口呢?這是由于我們是以Restful的形式來(lái)訪問(wèn)Controller接口的蚯斯,請(qǐng)求被攔截后薄风,發(fā)現(xiàn)Controller中剛好有定義好的請(qǐng)求規(guī)則滿足要求,于是允許訪問(wèn)Controller的該接口拍嵌,如果稍微與Controller層所定義請(qǐng)求規(guī)則不一致則會(huì)報(bào)404的錯(cuò)誤遭赂。同理,我們要訪問(wèn)靜態(tài)資源横辆,請(qǐng)求被攔截后撇他,如果沒(méi)有規(guī)則告訴SpringMVC我們要訪問(wèn)的靜態(tài)資源在哪里的話,就會(huì)報(bào)404的錯(cuò)誤狈蚤,也就是說(shuō)困肩,總得有個(gè)人告訴我我要訪問(wèn)的資源放在哪兒吧(就像Controller那樣,告訴請(qǐng)求脆侮,我這兒定義好了很多規(guī)則锌畸,如果你滿足我的規(guī)則條件,我就讓你訪問(wèn)靖避,否則潭枣,免談),只把請(qǐng)求攔截下來(lái)幻捏,啥也不告訴它盆犁,它就蒙圈了,不知道要怎么訪問(wèn)了篡九。
為了解決靜態(tài)資源被攔截而無(wú)法訪問(wèn)的問(wèn)題蚣抗,我們?cè)趕pringmvc.xml文件中配置下資源映射(也相當(dāng)于制定好訪問(wèn)規(guī)則)如上圖所示,我們之所以只配置了css瓮下、images翰铡、js的資源映射,而沒(méi)有配置jsp的映射是由于我們并不會(huì)直接去訪問(wèn)jsp資源文件讽坏,而是會(huì)經(jīng)過(guò)Controller接口锭魔,返回邏輯視圖,通過(guò)邏輯視圖去springmvc.xml文件中的視圖解析器配置(如上圖“視圖解析器配置”)當(dāng)中去匹配要訪問(wèn)的資源文件路呜,視圖解析器會(huì)自動(dòng)幫我們?cè)诜祷氐倪壿嬕晥D后面加上".jsp"迷捧,而且指定路徑就在WEB-INF/jsp/目錄下织咧,因此我們的jsp文件一定要放在WEB-INF下(除非你配置的視圖解析器的位置是別的目錄)
2.實(shí)現(xiàn)登錄,注冊(cè)頁(yè)面的跳轉(zhuǎn)
- 功能分析
請(qǐng)求的url:
登錄:/page/login
注冊(cè):/page/register
參數(shù):無(wú)
返回結(jié)果:邏輯視圖String
@Controller
public class PageController {
@RequestMapping("/page/register")
public String showRegister() {
return "register";
}
@RequestMapping("/page/login")
public String showLogin() {
return "login";
}
}
- 測(cè)試
PS:
1.頁(yè)面里面的某些跳轉(zhuǎn)還有很多不完善的漠秋,我改了一部分笙蒙,直接拿過(guò)去用就好了。如果還有一些跳轉(zhuǎn)到404就改成正確的地址就好了
2.登錄的時(shí)候可能會(huì)提示說(shuō)XXXXXXX為空庆锦,那是因?yàn)闆](méi)有判斷token為空捅位,加上這句代碼就好了
-
測(cè)試
啟動(dòng)taotao-manager、taotao-content搂抒、taotao-search艇搀、taotao-manager-web、taotao-portal-web求晶、taotao-search-web焰雕、taotao-item-web、taotao-sso芳杏、taotao-sso-web工程
輸入賬號(hào)密碼矩屁。我們可以看到跳轉(zhuǎn)到了首頁(yè)。
觀察上面首頁(yè)爵赵,可以看到我們的登錄狀態(tài)是已經(jīng)登錄的狀態(tài)
3.JS跨域問(wèn)題
登錄的時(shí)候我們把token寫(xiě)到了cookie當(dāng)中档插,登錄成功后,我們查看Cookie信息亚再,如下圖所示郭膛,發(fā)現(xiàn)是有token信息的。
我們回到登錄頁(yè)面氛悬,可以看到token信息则剃。如下圖所示∪缤保可以看到與淘淘商城首頁(yè)的token信息是完全一致的棍现。
不同的端口就已經(jīng)屬于跨域了
什么是跨域:
1、域名不同
2镜遣、域名相同端口不同己肮。
接著說(shuō)下什么是jsonp?
jsonp不是新技術(shù)悲关,它只是一種解決方案谎僻,使用js的特性繞過(guò)跨域請(qǐng)求,利用的特性便是js可以跨域加載js文件T⑷琛艘绍!舉個(gè)非常常見(jiàn)的例子,我們?cè)趆tml頭部一般都會(huì)引入很多js秫筏,甚至我們直接引用在線的js诱鞠,比如我們引用官方網(wǎng)站的jQuery路徑加載進(jìn)來(lái)也是可以的挎挖。JQuery的官方域名與我們的工程所在的域名肯定是不一樣的,但是不影響使用航夺,這就是我們所說(shuō)的js可以跨域請(qǐng)求js文件蕉朵!
跨域的特點(diǎn)是什么呢?我們可以在"Network"一欄看到請(qǐng)求的token信息阳掐,在Headers當(dāng)中發(fā)現(xiàn)服務(wù)端已經(jīng)正常響應(yīng)了始衅,如下圖所示。
我們?cè)倏聪翿esponse一欄锚烦,發(fā)現(xiàn)沒(méi)有任何信息,其實(shí)流程是這樣的帝雇,我們使用ajax調(diào)用服務(wù)端的接口涮俄,服務(wù)端不管你請(qǐng)求是否是同一個(gè)域下,只管響應(yīng)尸闸,于是 我們可以看到服務(wù)端響應(yīng)的頭信息彻亲,但是當(dāng)數(shù)據(jù)經(jīng)過(guò)瀏覽器時(shí),瀏覽器判斷出js訪問(wèn)的數(shù)據(jù)來(lái)自不同的域吮廉,于是便拒絕將數(shù)據(jù)返給頁(yè)面苞尝。我們拿不到Response信息,也就無(wú)法展示內(nèi)容了宦芦。
那么jsonp是怎樣解決跨域問(wèn)題的呢宙址?流程圖如下,圖的上半部分展示的是傳統(tǒng)跨域請(qǐng)求调卑,這種請(qǐng)求我們是獲取不到Response數(shù)據(jù)的抡砂,下半部分是介紹jsonp跨域獲取數(shù)據(jù)的方案的。我們現(xiàn)在要跨域獲取信息的js當(dāng)中添加一個(gè)函數(shù)恬涧,該函數(shù)有返回值參數(shù)data注益,發(fā)起跨域請(qǐng)求的一端引入服務(wù)端定義好的一個(gè)js文件,請(qǐng)求的參數(shù)中是帶callback回調(diào)函數(shù)的溯捆,并且callback=mycall中的"mycall"一定是與我們添加的那個(gè)函數(shù)的名稱一致的丑搔,服務(wù)端接收到請(qǐng)求,就進(jìn)行響應(yīng)提揍,并且判斷參數(shù)中是否有callback參數(shù)啤月,如果有callback參數(shù)的話,就對(duì)要返回的數(shù)據(jù)進(jìn)行處理劳跃,加工成一段js代碼(很簡(jiǎn)單顽冶,就是把一個(gè)json串包裝成一個(gè)js函數(shù),如下圖mycall({id:1,name:z});)然后響應(yīng)售碳,js本來(lái)就是要請(qǐng)求訪問(wèn)服務(wù)端的一個(gè)js文件强重,現(xiàn)在返回的也是js代碼绞呈,于是瀏覽器將不再進(jìn)行攔截,由于返回的是js代碼间景,而且js語(yǔ)句有個(gè)特點(diǎn)就是佃声,一旦響應(yīng)到瀏覽器端便立即執(zhí)行,我們已經(jīng)添加了該函數(shù)倘要,于是便調(diào)用我們添加的那個(gè)函數(shù)圾亏,我們只需把數(shù)據(jù)做下處理并進(jìn)行展示就可以了!7馀 志鹃!
下面我們便來(lái)實(shí)現(xiàn)jsonp請(qǐng)求,上圖所介紹的方法是比較復(fù)雜的泽西,如果我們用jquery的話曹铃,如下圖所示
我們刷新下淘淘商城首頁(yè),可以看到請(qǐng)求中自動(dòng)為我們加上了回調(diào)函數(shù)捧杉,而且隨機(jī)為我們添加了函數(shù)名為"jQuery3257776"的函數(shù)陕见。
現(xiàn)在我們要做的便是修改服務(wù)端的代碼,以便能夠配合客戶端完成整個(gè)請(qǐng)求過(guò)程味抖,修改的方法如下圖所示评甜,我們將原來(lái)返回一個(gè)Map類型改為返回String類型,而且添加了callback參數(shù)仔涩,判斷下是否有callback參數(shù)忍坷,如果有就說(shuō)明是jsonp請(qǐng)求,我們要將result轉(zhuǎn)換成json串并且包裝成一個(gè)js函數(shù)返回熔脂。如果不是jsonp請(qǐng)求承匣,那就直接將result轉(zhuǎn)換成json串返回。
//獲取用戶信息
@RequestMapping(value = "/user/token/{token}",method = RequestMethod.GET)
@ResponseBody
public String getUserByToken(@PathVariable String token,String callback){
TaotaoResult result = userService.getUserMessageByToken(token);
if(StringUtils.isNotBlank(callback)) {
return callback + "(" + JsonUtils.objectToJson(result) + ");";
}
return JsonUtils.objectToJson(result);
}
- 測(cè)試
測(cè)試的結(jié)果如上圖所示(我們可以到admin已經(jīng)登錄的信息)
參考博文:
https://blog.csdn.net/u012453843/article/details/73033114