支持配置sessionExpireTime

This commit is contained in:
ivinwu
2018-09-24 21:58:20 +08:00
parent 53cc7f50d8
commit 5e6abad91f
5 changed files with 111 additions and 30 deletions

View File

@@ -105,6 +105,8 @@ weRequest.request({
|reportCGI|Function|否||接口返回成功之后,会执行统一的回调函数,这里可以做统一的耗时上报等处理| |reportCGI|Function|否||接口返回成功之后,会执行统一的回调函数,这里可以做统一的耗时上报等处理|
|mockJson|Object|否||可为接口提供mock数据| |mockJson|Object|否||可为接口提供mock数据|
|globalData|Object/Function|否||所有请求都会自动带上这里的参数| |globalData|Object/Function|否||所有请求都会自动带上这里的参数|
|sessionExpireTime|Int|否|null|为用户登陆态设置本地缓存时间单位为ms一旦过期直接废弃缓存中的登陆态|
|sessionExpireKey|String|否|sessionExpireKey|如果为用户登陆态设置了本地缓存时间则过期时间将以此值为key存储在Storage中|
##### codeToSession参数说明 ##### codeToSession参数说明
@@ -261,7 +263,14 @@ weRequest.request({
### .getConfig() ### .getConfig()
[return Object] [return Object]
获取weRequest的配置。目前Object仅包含urlPerfix字段 获取weRequest的配置。返回的Object内容如下:
|参数名|类型|说明|
| :-------- | :-------| :------ |
|urlPerfix|String|在组件初始化时传入的请求URL的固定前缀|
|sessionExpireTime|Int|在组件初始化时传入的用户登陆态设置本地缓存时间|
|sessionExpireKey|String|在组件初始化时传入的用户登陆态本地缓存时间Storage的key|
|sessionExpire|Int|用户登陆态本地缓存过期的时间戳|
### .login() ### .login()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,63 +1,64 @@
var weRequest = require('../src/weRequest'); var weRequest = require('../src/weRequest');
weRequest.init({ weRequest.init({
// 存在localStorage的session名称且CGI请求的data中会自动带上以此为名称的session值可不配置默认为session // [可选] 存在localStorage的session名称且CGI请求的data中会自动带上以此为名称的session值可不配置默认为session
sessionName: "session", sessionName: "session",
// 请求URL的固定前缀可不配置默认为空 // [可选] 请求URL的固定前缀可不配置默认为空
urlPerfix: "https://www.example.com/", urlPerfix: "https://www.example.com/",
// 触发重新登录的条件res为CGI返回的数据 // [必填] 触发重新登录的条件res为CGI返回的数据
loginTrigger: function (res) { loginTrigger: function (res) {
// 此处例子当返回数据中的字段errcode等于-1会自动触发重新登录 // 此处例子当返回数据中的字段errcode等于-1会自动触发重新登录
return res.errcode == -1; return res.errcode == -1;
}, },
// 用code换取session的CGI配置 // [必填] 用code换取session的CGI配置
codeToSession: { codeToSession: {
// CGI的URL // [必填] CGI的URL
url: 'user/login', url: 'user/login',
// 调用改CGI的方法可不配置默认为GET // [可选] 调用改CGI的方法可不配置默认为GET
method: 'GET', method: 'GET',
// CGI中传参时存放code的名称此处例子名称就是code可不配置默认值为code // [可选] CGI中传参时存放code的名称此处例子名称就是code可不配置默认值为code
codeName: 'code', codeName: 'code',
// 登录接口需要的其他参数;可不配置,默认为{} // [可选] 登录接口需要的其他参数;可不配置,默认为{}
data: {}, data: {},
// CGI中返回的session值 // [必填] CGI中返回的session值
success: function (res) { success: function (res) {
// 此处例子CGI返回数据中的字段session即为session值 // 此处例子CGI返回数据中的字段session即为session值
return res.session; return res.session;
}, },
// [可选] 接口失败的回调,可不配置,默认为弹窗报错
fail: function(obj, res) { fail: function(obj, res) {
} }
}, },
// 登录重试次数,当连续请求登录接口返回失败次数超过这个次数,将不再重试登录 // [可选] 登录重试次数,当连续请求登录接口返回失败次数超过这个次数,将不再重试登录可不配置默认为重试3次
reLoginLimit: 2, reLoginLimit: 2,
// 触发请求成功的条件 // [必填] 触发请求成功的条件
successTrigger: function (res) { successTrigger: function (res) {
// 此处例子当返回数据中的字段errcode等于0时代表请求成功其他情况都认为业务逻辑失败 // 此处例子当返回数据中的字段errcode等于0时代表请求成功其他情况都认为业务逻辑失败
return res.errcode == 0; return res.errcode == 0;
}, },
// 成功之后返回数据;可不配置 // [可选] 成功之后返回数据;可不配置
successData: function (res) { successData: function (res) {
// 此处例子返回数据中的字段data为业务接受到的数据 // 此处例子返回数据中的字段data为业务接受到的数据
return res.data; return res.data;
}, },
// 当CGI返回错误时弹框提示的标题文字 // [可选] 当CGI返回错误时弹框提示的标题文字
errorTitle: function(res) { errorTitle: function(res) {
// 此处例子当返回数据中的字段errcode等于0x10040730时错误弹框的标题是“温馨提示”其他情况下则是“操作失败” // 此处例子当返回数据中的字段errcode等于0x10040730时错误弹框的标题是“温馨提示”其他情况下则是“操作失败”
return res.errcode == 0x10040730 ? '温馨提示' : '操作失败' return res.errcode == 0x10040730 ? '温馨提示' : '操作失败'
}, },
// 当CGI返回错误时弹框提示的内容文字 // [可选] 当CGI返回错误时弹框提示的内容文字
errorContent: function(res) { errorContent: function(res) {
// 此处例子返回数据中的字段msg为错误弹框的提示内容文字 // 此处例子返回数据中的字段msg为错误弹框的提示内容文字
return res.msg ? res.msg : '服务可能存在异常,请稍后重试' return res.msg ? res.msg : '服务可能存在异常,请稍后重试'
}, },
// 当出现CGI错误时统一的回调函数这里可以做统一的错误上报等处理 // [可选] 当出现CGI错误时统一的回调函数这里可以做统一的错误上报等处理
errorCallback: function(obj, res) { errorCallback: function(obj, res) {
// do some report // do some report
}, },
// 是否需要调用checkSession验证小程序的登录态过期可不配置默认为false // [可选] 是否需要调用checkSession验证小程序的登录态过期可不配置默认为false
doNotCheckSession: true, doNotCheckSession: true,
// 上报耗时的函数name为上报名称startTime为接口调用开始时的时间戳endTime为接口返回时的时间戳 // [可选] 上报耗时的函数name为上报名称startTime为接口调用开始时的时间戳endTime为接口返回时的时间戳
reportCGI: function(name, startTime, endTime, request) { reportCGI: function(name, startTime, endTime, request) {
//wx.reportAnalytics(name, { //wx.reportAnalytics(name, {
// time: endTime - startTime // time: endTime - startTime
@@ -74,14 +75,18 @@ weRequest.init({
//}) //})
console.log(name + ":" + (endTime - startTime)); console.log(name + ":" + (endTime - startTime));
}, },
// 提供接口的mock若不需使用请设置为false // [可选] 提供接口的mock若不需使用请设置为false
mockJson: require("../../mock.json"), mockJson: require("../../mock.json"),
// 所有请求都会自动带上globalData里的参数 // [可选] 所有请求都会自动带上globalData里的参数
globalData: function() { globalData: function() {
return { return {
version: getApp().version version: getApp().version
} }
} },
// [可选] session本地缓存时间(单位为ms),可不配置,默认不设置本地缓存时间
sessionExpireTime: 24 * 60 * 60 * 1000,
// [可选] session本地缓存时间存在Storage中的名字可不配置默认为 sessionExpireKey
sessionExpireKey: "sessionExpireKey"
}) })
module.exports = weRequest; module.exports = weRequest;

View File

@@ -23,6 +23,12 @@ var errorCallback = null;
var reportCGI = false; var reportCGI = false;
var mockJson = false; var mockJson = false;
var globalData = false; var globalData = false;
// session在本地缓存的有效时间
var sessionExpireTime = null;
// session在本地缓存的key
var sessionExpireKey = "sessionExpireKey";
// session过期的时间点
var sessionExpire = Infinity;
//global data //global data
var session = ''; var session = '';
@@ -71,9 +77,18 @@ function checkSession(callback, obj) {
} }
function doLogin(callback, obj) { function doLogin(callback, obj) {
if (session || obj.isLogin) { if (obj.isLogin) {
// 缓存中有session或者是登录接口 // 登录接口,直接放过
typeof callback === "function" && callback(); typeof callback === "function" && callback();
} else if(session) {
// 缓存中有session
if(sessionExpireTime && new Date().getTime() > sessionExpire) {
// 如果有设置本地session缓存时间且缓存时间已到
session = '';
doLogin(callback, obj);
} else {
typeof callback === "function" && callback();
}
} else if (logining) { } else if (logining) {
// 正在登录中,请求轮询稍后,避免重复调用登录接口 // 正在登录中,请求轮询稍后,避免重复调用登录接口
flow.wait('doLoginFinished', function () { flow.wait('doLoginFinished', function () {
@@ -117,6 +132,14 @@ function doLogin(callback, obj) {
success: function (s) { success: function (s) {
session = s; session = s;
sessionIsFresh = true; sessionIsFresh = true;
// 如果有设置本地session过期时间
if(sessionExpireTime) {
sessionExpire = new Date().getTime() + sessionExpireTime;
wx.setStorage({
key: sessionExpireKey,
data: sessionExpire
})
}
typeof callback === "function" && callback(); typeof callback === "function" && callback();
wx.setStorage({ wx.setStorage({
key: sessionName, key: sessionName,
@@ -492,9 +515,16 @@ function init(params) {
reportCGI = params.reportCGI || false; reportCGI = params.reportCGI || false;
mockJson = params.mockJson || false; mockJson = params.mockJson || false;
globalData = params.globalData || false; globalData = params.globalData || false;
sessionExpireTime = params.sessionExpireTime || null;
sessionExpireKey = params.sessionExpireKey || "sessionExpireKey";
try { try {
session = wx.getStorageSync(sessionName) || ''; session = wx.getStorageSync(sessionName) || '';
sessionExpire = wx.getStorageSync(sessionExpireKey) || Infinity;
// 如果有设置本地session过期时间且验证已过期则直接清空session
if(new Date().getTime() > sessionExpire) {
session = '';
}
} catch (e) { } catch (e) {
} }
} }
@@ -548,7 +578,10 @@ function getSession() {
function getConfig() { function getConfig() {
return { return {
'urlPerfix': urlPerfix urlPerfix: urlPerfix,
sessionExpireTime: sessionExpireTime,
sessionExpireKey: sessionExpireKey,
sessionExpire: sessionExpire
} }
} }
@@ -560,4 +593,4 @@ module.exports = {
login: login, login: login,
getSession: getSession, getSession: getSession,
getConfig: getConfig getConfig: getConfig
}; };