成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Node.js的微信小程序cookie解決方案

meteor199 / 2435人閱讀

摘要:踩過微信小程序坑的人都知道,微信小程序是不支持的。微信小程序采用的是獲取,通過開發(fā)者服務(wù)器端同微信服務(wù)器進(jìn)行數(shù)據(jù)交互實現(xiàn)登錄。具體參考微信相關(guān)文檔,這里不贅述。而且萬一哪天微信小程序支持了呢,采用方式,還是和以前一樣操作數(shù)據(jù)。

?????????踩過微信小程序坑的人都知道,微信小程序是不支持cookie的。微信小程序采用的是wx.login獲取code,通過開發(fā)者服務(wù)器端同微信服務(wù)器進(jìn)行數(shù)據(jù)交互實現(xiàn)登錄。得到openid或者unionid與本地數(shù)據(jù)庫關(guān)聯(lián),從而得到登錄用戶相關(guān)信息。

?????????具體參考微信相關(guān)文檔wx.login,這里不贅述。

?????????通常情況下,我們不僅僅是需要用戶數(shù)據(jù),還需要用戶的登錄狀態(tài),也就是session和cookie機制。要命的是小程序不支持cookie,沒有了cookie,session也無從談起。這里基于node.js的express和koa,通過header頭添加標(biāo)記的方式,模擬cookie,從而在服務(wù)器端引入session。

?????????cookie的本質(zhì)是唯一字符串標(biāo)記,由瀏覽器自動生成(這里是作為會話方案,而非數(shù)據(jù)存儲方案而言)。既然是唯一字符串標(biāo)記,那我們也可以自己生成一個類似的標(biāo)記,添加到Headers頭中,類似這樣

let header={"x-xxxx-cookie":"uuid cookie"};
//
wx.request({
    url:url,
    data:data,
    header:header,
    method:method,
    success: function( res ) {
        
    },
    fail: function( error ) {
    
    }
});

?????????需要注意的是,這里的uuid cookie最好使用服務(wù)器端的session ID,后面再說為什么?

?????????以上就是前端(小程序端)的處理,接下來是服務(wù)器端的處理,服務(wù)器端使用的是express或者koa,具體使用請移步:
?????????Express
?????????Koa

?????????服務(wù)器端Express中session使用的是express-session,Koa中使用的是koa-generic-session,對于Koa這里多說一句,原本也打算使用koa-session,最后放棄選擇了前者,因為后者沒有暴露出類似獲取session ID的參數(shù),而整個過程中需要獲取到session ID非常重要。session存儲都使用Redis。
Express部分代碼如下:

var express = require("express");
var session = require("express-session");
var cookieParser = require("cookie-parser");
var RedisStore = require("connect-redis")(session);

//
var sessionStore=new RedisStore({
    host:config.redis.host,
    port:config.redis.port
});
var app = express();
//
app.use(cookieParser());

//cookie
var cookieParser=cookieParser(config.secret);
app.use(cookieParser);

//session
var sessionParser = session({
    store:sessionStore,
    secret:config.secret,
});
app.use(sessionParser);    

//

Koa部分代碼:

const Koa  = require("koa");
const session = require("koa-generic-session");
//const session = require("koa-session");
const RedisStore = require("koa-redis");
//
const app = new Koa();

// middlewares
app.use(bodyparser({
  enableTypes:["json", "form", "text"]
}));
//
let sessionStore=new RedisStore(sessionRedisOptions);
let sessionOptions={
    store: sessionStore,
    key: "",
};
//
const sessionParser = session(sessionOptions,app);
app.use(sessionParser);

?????????獲取session ID,Express中可以直接通過req.sessionID獲取得到,koa中使用ctx.sessionId獲取得到。之所以session ID重要,主要是我們可以直接通過它獲取到session。如果不使用session ID的方式的話,我們需要自己額外去存儲相關(guān)數(shù)據(jù),可以不用將數(shù)據(jù)掛載到req.session或者ctx.session上,會帶來額外的代碼成本。而且萬一哪天微信小程序支持cookie了呢,采用session ID方式,還是和以前一樣操作session數(shù)據(jù)。

?????????我們需要將session ID從服務(wù)器端返回到小程序端,通常會在第一個請求的時候就返回,然后小程序端將該數(shù)據(jù)保存,類似這樣:

    app.globalData.cookieID=uuid cookie;//uuid cookie為服務(wù)器端返回的session ID

?????????小程序端以后的請求都將該數(shù)據(jù)添加到Headers頭中傳遞到服務(wù)器端。

?????????服務(wù)器端下一個請求,直接通過req.session或者ctx.session還是獲取不到之前設(shè)置的session數(shù)據(jù)??!
?????????的確是的,我們需要在路由之前,添加一個中間件來解決。類似這樣:
Express部分代碼:

app.use(function(req,res,next){
    //
    var sessionID=req.headers["x-xxxx-cookie"];
    if(sessionID){
        //
        return sessionStore.get(sessionID,function(err,session){
            //
            req.session=Object.assign(req.session||{},session||{});
            //
            next();
        });
    }
    //
    next();
});

Koa部分代碼:

app.use(async function (ctx,next){
    //
    var cookies=ctx.cookies;
    var sessionID=ctx.request.headers["x-xxxx-cookie"]||cookies.get(sessionOptions.key);
    if(sessionID){
        //
        let sess= await ctx.sessionStore.get(sessionID);
        //
        let session=Object.assign(ctx.session||{},sess||{});
        ctx.session=session;
    }
    //
    await next();
});

?????????也就是我們需要通過session ID得到session,然后賦值到req.session或者ctx.session上,保證之后可以直接按照普通方式操作session數(shù)據(jù)。

?????????好了,就到這里,總結(jié)一下:
?????????通過header添加類cookie唯一字符串標(biāo)記,而該字符串標(biāo)記直接對應(yīng)服務(wù)器端session ID,可以在服務(wù)器端直接通過session ID獲取到session數(shù)據(jù),利用中間件將獲取到的session數(shù)據(jù)賦值給request,從而實現(xiàn)小程序端就像支持cookie一樣。

?????????如果引入了socket,比如ws,個中過程又要復(fù)雜一些,額外引入其他坑需要填埋,下回再表。

PS:以上為項目部分代碼,不保證能夠完全運行。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95262.html

相關(guān)文章

  • 信小程序資源匯總

    awesome-github-wechat-weapp 是由OpenDigg整理并維護(hù)的微信小程序開源項目庫集合。我們會定期同步上的項目到這里,也歡迎各位 UI組件開發(fā)框架實用庫開發(fā)工具服務(wù)端項目實例Demo UI組件 weui-wxss ★1873 - 同微信原生視覺體驗一致的基礎(chǔ)樣式庫zanui-weapp ★794 - 好用易擴(kuò)展的小程序 UI 庫wx-charts ★449 - 微信小程...

    Olivia 評論0 收藏0
  • 「前端早讀君009」快速小程序開發(fā)之微信小程序內(nèi)嵌 H5

    摘要:前言微信小程序中可以直接運行頁面,這一新組件的產(chǎn)生,可能直接導(dǎo)致小程序數(shù)量迎來一波高峰。微信小程序配置系列問題配置域名業(yè)務(wù)域名中配置的就是小程序以及和中引用的域名。 今日勵志語 要接受自己行動所帶來的責(zé)任而非自己成就所帶來的榮耀。 前言 微信小程序中可以直接運行 web 頁面,這一新組件 web-view 的產(chǎn)生,可能直接導(dǎo)致小程序數(shù)量迎來一波高峰。本篇博文將從業(yè)務(wù)選型,微信小程序后臺...

    wh469012917 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<