問題描述
當(dāng)微信小程序開發(fā)中用laravel做后臺(tái)的時(shí)候一定會(huì)遇到登錄session的問題
因?yàn)樾〕绦驔]有cookie,所以每一次請求的時(shí)候,相當(dāng)于關(guān)閉瀏覽器,重新打開瀏覽器請求,服務(wù)器會(huì)重新生成一條session。php的有自己的session回收機(jī)制,但是laravel并沒有用PHP的session那套,而是有一套自己的session機(jī)制。本人是用的redis存儲(chǔ)session,這相當(dāng)于每次請求的時(shí)候都在redis中新生成一條記錄,當(dāng)訪問量特別大的時(shí)候,請求比較多,而設(shè)置的session時(shí)間又很長的時(shí)候這個(gè)時(shí)候可能導(dǎo)致redis撐爆,要保證session不重新生成,網(wǎng)上有介紹很多辦法,可以直接用別人針對微信登錄的vendor包,也可以自己動(dòng)手。
解決辦法
- 小程序重新封裝一個(gè)http請求,將cookie放在header頭中,每次請求帶上cookie
function Http({
url,
data,
success,
fail,
complete,
method = "POST"
}) {
var session_id = wx.getStorageSync('PHPSESSID'); //本地取存儲(chǔ)的sessionID
if (session_id != "" && session_id != null) {
var header = {
'content-type': 'application/x-www-form-urlencoded',
'Cookie': 'skey=' + session_id
}
} else {
var header = {
'content-type': 'application/x-www-form-urlencoded'
}
}
wx.request({
url: url,
method: method,
data: data,
header: header,
success: res => {
console.log(res);
if (session_id == "" || session_id == null) {
wx.setStorageSync('PHPSESSID', res.data.session_id) //如果本地沒有就說明第一次請求 把返回的session id 存入本地
}
let data = res.data
res['statusCode'] === 200 ? success(data) : fail(res)
},
fail: fail,
complete: complete
})
}
2.修改laravel的env配置加上
SESSION_COOKIE=skey
3.關(guān)鍵的一點(diǎn)就是在Illuminate\Session\Middleware\StartSession中g(shù)etSession中通過cookie獲取cookie值的時(shí)候,居然沒有獲取到,而普通瀏覽器請求可以獲取到,這里面的laravel機(jī)制沒有追到,所以之后修改vendor代碼如下,直接使用php的$_COOKIE獲取
public function getSession(Request $request)
{
return tap($this->manager->driver(), function ($session) use ($request) {
$cookie_name = $session->getName();
$sesssion_id = isset($_COOKIE[$cookie_name]) ? $_COOKIE[$cookie_name] : '';
$session->setId($sesssion_id);
// $session->setId($request->cookies->get($session->getName()));
});
}