問(wèn)題:本地服務(wù)器存取session沒(méi)有問(wèn)題。通過(guò)小程序叨恨,比如發(fā)驗(yàn)證碼柳刮,服務(wù)器端將驗(yàn)證碼存為session。校驗(yàn)驗(yàn)證碼的時(shí)候重新取session,提示session值不存在痒钝。
根源:微信小程序不能保存Cookie秉颗,導(dǎo)致每次wx.request到服務(wù)端都會(huì)創(chuàng)建一個(gè)新的會(huì)話,從而當(dāng)前會(huì)話不再是之前存驗(yàn)證碼的那個(gè)會(huì)話送矩,自然也就取不到session值了蚕甥。
解決方法:(由于本人很懶,直接參考栋荸、引用大神的文章菇怀,文末有原文鏈接,原文板塊比較好看一點(diǎn)晌块。我這里重點(diǎn)在于記錄微信小程序的另一個(gè)坑爱沟。)
普通的Web開(kāi)發(fā),都是把sessionid保存在cookie中傳遞的匆背。
不管是java還是php呼伸,服務(wù)端的會(huì)在response的header中加上Set-Cookie
例如:
Response Headers
Content-Type:application/json;charset=UTF-8
Date:Mon, 02 Apr 2018 16:02:42 GMT
Set-Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly
瀏覽器的請(qǐng)求也會(huì)在header中加上
例如:
Request Headers
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:564
content-type:application/json
Cookie:JSESSIONID=781C7F500DFA24D663BA243A4D9044BC;path=/yht;HttpOnly
通過(guò)這個(gè)sessionid就能使瀏覽器端和服務(wù)端保持會(huì)話,使瀏覽器端保持登錄狀態(tài)钝尸。但是括享,微信小程序不能保存Cookie,導(dǎo)致每次wx.request到服務(wù)端都會(huì)創(chuàng)建一個(gè)新的會(huì)話珍促,小程序端就不能保持登錄狀態(tài)了铃辖。
一個(gè)比較簡(jiǎn)單的辦法就是在小程序端把cookie保存到storage里,后續(xù)請(qǐng)求的時(shí)候再讀storage猪叙,把cookie添加到請(qǐng)求頭里娇斩,這樣做的好處就是,服務(wù)端不用做任何改動(dòng)
具體操作如下:
1.把服務(wù)端response的Set-Cookie中的值保存到Storage中
wx.request({
????url: path,method:method,
????header: header,
????data:data,
????success:function(res){
????????if(res && res.header && res.header['Set-Cookie']){
? ? ? ? ? ????? wx.setStorageSync('cookieKey', res.header['Set-Cookie']);//保存Cookie到Storage
????????}
????},
????fail:fail??
})
2.wx.request再?gòu)腟torage中取出Cookie,封裝到header中
letcookie = wx.getStorageSync('cookieKey');
letpath=conf.baseurl+url;
letheader = { };
if(cookie){? ?
?????header.Cookie=cookie;?
?}? ??
wx.request({? ??
????url: path,? ?
?????method:method,? ??
????header: header,? ??
????data:data,? ??
????success:success,? ?
?????fail:fail?
?})
重點(diǎn)來(lái)了:微信小程序 wx.request 回調(diào)時(shí)取響應(yīng)頭Set-Cookie的坑
我在這里還遇到了另外一個(gè)問(wèn)題沐悦,當(dāng)服務(wù)器響應(yīng)多個(gè)Set-Cookie時(shí)成洗,小程序通過(guò)wx.request 回調(diào)取res.header['Set-Cookie']所取到的Set-Cookie值是把它們用逗號(hào)拼接在一起,從而產(chǎn)生的錯(cuò)誤的Cookie藏否,這樣請(qǐng)求后臺(tái)的時(shí)候還是取不到相應(yīng)的session。而真正需要的是用分號(hào)拼接多個(gè)Set-Cookie值充包。例如:
服務(wù)器響應(yīng):
Set-Cookie:session_name=184299abe5d9ac09559df76bff200a7985e55f86; expires=Tue, 23-Oct-2018 09:15:38 GMT; Max-Age=7200; path=/; HttpOnly
Set-Cookie:shop_rootpath=app%2Fsmallapp
小程序通過(guò)res.header['Set-Cookie']取到的Set-Cookie值卻是:
"shop_rootpath=app%2Fsmallapp,session_name=184299abe5d9ac09559df76bff200a7985e55f86; expires=Tue, 23-Oct-2018 09:15:38 GMT; Max-Age=7200; path=/; HttpOnly"
而真正正確的值應(yīng)該是smallapp與session_name之間用分號(hào)隔開(kāi)而不是逗號(hào):
"shop_rootpath=app%2Fsmallapp;session_name=184299abe5d9ac09559df76bff200a7985e55f86; expires=Tue, 23-Oct-2018 09:15:38 GMT; Max-Age=7200; path=/; HttpOnly"
但坑終究是坑副签,寄人籬下遥椿,有坑也只得我們自己填。
填坑方法:在步驟2中的if判斷中淆储,自己重新拆分Storage中取出的Cookie冠场,整理成后端需要的規(guī)范的cookie。再賦值給header.Cookie本砰。
if(cookie){? ?
? ???//步驟1: 用JS的split()函數(shù)拆分cookie
? ? ?//步驟 2:組裝成需要的新cookie
? ? ??var newcookie = XXX;
?????//步驟 3:賦值
? ? ? ?header.Cookie=newcookie;?
?}? ?
這個(gè)問(wèn)題暫時(shí)沒(méi)找到其他解決方案碴裙,也請(qǐng)知道的朋友指點(diǎn)一下。
原文引用:微信小程序開(kāi)發(fā)-保存服務(wù)端sessionid的方法
作者:愛(ài)吐槽的coder
鏈接:http://www.reibang.com/p/5c928e0df024