小程序页面间有哪些传递数据的方法?

小程序页面间有哪些传递数据的方法?,第1张

主要有:参数传递、localstorage传递、全局变量传递和页面对象传递等。

最常见的是参数传递,也就是在地址后面加上参数,然后在onload函数里面获取参数。

localstorage传递,就是把需要传递的参数保存到本地,在需要获取的页面当中获取保存的值,并且可以在不需要的时候删除。

全局变量传递,就是在页面当中改变app全局的某些变量,并且在需要获取的页面当中获取全局变量的值。

页面对象传递,就是获取当前的页面对象数组,找到相应的页面,并且执行该页面的方法进行直接赋值,实现传递参数的目的。

在微信小程序中,数据缓存其实就和localstorage 的原理差不多,所以理解起来并不难。下面我们来一起实现一下。

效果图展示:

我们在index页面存入数字11,然后在跳转到新页面,在将缓存中的11取出渲染到当前页面。具体代码如下:

index页面:

<span style="font-size:24px">

<view class="btn-area">

<navigator url="../navigator/navigator?title=我是navi">跳转到新的页面post情求</navigator>

<navigator url="../redirect/redirect?title=我是red" redirect>跳转到当前页面</navigator>

</view>

</span>

<view>

<input style="border:2rpx solid red" placeholder="输入信息" bindinput="getInput" />

<button style="border:2rpx solid yellow" bindtap="saveInput">存入</button>

</view>1234567891012345678910

index的js:

//index.js

//获取应用实例

var app = getApp()

Page({

data: {

storage:''

},

onLoad: function () {

var that = this

//获取输入值

getInput:function(e){

this.setData({

storage:e.detail.value

})

},

//存储输入值

saveInput:function(){

wx.setStorageSync('storage', this.data.storage)

}

})

12345678910111213141516171819202122231234567891011121314151617181920212223

跳转页面:

<view>从存储中得到的数据:{{storage}}</view>11

跳转页面的js:

var app = getApp()

var that

Page( {

data: {

storage:''

},

onLoad: function(options) {

that = this

//获取存储信息

wx.getStorage({

key: 'storage',

success: function(res){

// success

that.setData({

storage:res.data

})

}

})

}

})

本文以抖音小程序(微信小程序获取流程和接口一模一样)为例,最近博主在做一个抖音小程序的小项目,前端在获取用户手机号的时候,需要调用 tt.login 接口进行登录,登录后返回一个code,这个code有3分钟的失效时间,根据这个code可以获取到sessionKey,这个sessionKey类似于对称加密的密钥,会对用户信息进行加密。在获取用户信息的时候,前端

需要将 <button>组件 open-type 的值设置为 getPhoneNumber。用户点击后会d出一个授权d窗让用户确认(若该用户账户未绑定手机号码会执行一次绑定手机号码的流程;授权d窗每次使用都会d出)。 用户同意后,开发者可以通过 bindgetphonenumber 事件回调获取到一个加密数据,开发者可以把该数据传回到自己的服务端进行解密获取手机号。

获取到的加密数据需要使用sessionKey进行解密,因此在获取用户信息前,需要登录一次,获取到code,然后根据code获取到sessionKey,再根据sessionKey进行加密数据的解密,解析出手机号。

根据博主猜测,抖音在登录后会生成一个code,和一个对应的sessionKey,在会话期间(session未过期)的时候获取用户信息,会将用户信息使用sessionKey进行数据的加密,进行数据的解密也需要使用到sessionKey。code和sessionKey是对应的,但是它们的失效期是不一样的,code的失效期是3分钟,sessionKey的失效时间是不定的,只要用户活跃在页面上都不会失效。在获取到code的3分钟内调用 code-2-session 接口,会获取到sessionKey,如果3分钟后根据code获取sessionKey将会获取失败,因此解密也会失败。

因为无法判断用户什么时候开始获取用户信息,所以用户一进入页面,前端就会调用 tt.login 接口进行登录,然后放到localstorage缓存中,在用户点击按钮时,d出授权框用户确认后获取到用户信息的加密数据,然后前端将缓存的code和加密数据一并传给后端。后端用code先去调用 code-2-session 接口获取到sessionKey,然后以sessionKey为密钥进行AES解密,获取到手机号返回给前台。整个流程看起来没什么问题,但是一旦用户在页面停留时间超过3分钟,然后再去获取用户信息会失败,主要是因为code已经失效,获取sessionKey会失败。

目前的问题就是过了code的有效期后,根据code获取sessionKey失败。那么在前端login获取到code后,先缓存到本地,然后立即调用后台接口去获取sessionKey然后缓存到redis里面,key为code,value为sessionKey。失效时间根据自己的业务设置(小程序页面用户不会停留太久,因此缓存失效时间设置为30分钟),用户退出小程序后,会重新login,然后也会存一份新的code和sessionKey的对应值。

用户在授权到用户信息后,前端直接将缓存的code和加密后的用户信息上传到服务到进行解密。服务端根据code从缓存中先获取到sessionKey,然后再用sessionKey进行解密,解析出手机号进行返回。

以上解决办法每次基本都可以获取手机号成功,但是也会存在一些问题

UserInfoController主要提供两个接口,一个是解密手机号和code2seesion *** 作

TiktokEncryptedParam 主要是前端传过来的code和加密后的数据

TiktokUserInfoSPI 主要是对接口的封装

TiktokUserInfoSPIAdapter 实现接口

使用AES对称加密


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11567463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存