前端页面开发时,经常需要异步校验登录态,每次都重新copy之前写的方法,比较繁琐不好维护,固将登录态校验封装成一个js。

(function(){
//登录状态 1 登录态有效 2 登录态无效 3 请求超时
var status;
//状态到期时间戳
var status_exprie_timestamp;
//默认超时时间(秒数)
var default_exprie_time = 60;
//限定协议名只能为https 或 http
var lp = "https:" == document.location.protocol ? 'https:' : 'http:'; //检测是否登录
//login_user_id 用户id | session_id 会话id | callback 成功失败超时后的回调函数
//超时时间5秒
function check_login(login_user_id,session_id,callback){
//有状态 且 未过期 且 状态不为3(请求超时) 直接调用callback不更新过期时间戳
if(status && !status_is_expire() && status != 3){
callback(status);
return ;
} //格式判断
if(!check_login_user_id(login_user_id) || !check_session_id(session_id)){
exec(2,callback);
return ;
} //构建请求相关的变量
var ajax_url = lp+'//host/xxx';
var data = {
'login_user_id':login_user_id,
'session_id':session_id,
'onlyjson':0,
't':new Date().getTime()
}; //请求
$.ajax({
type : "get",
url : ajax_url,
data : data,
timeout : 5000,
dataType : "jsonp",
success : function(data){
if(data.rtn==0){
exec(1,callback);
}else{
exec(2,callback);
}
},
error:function(data, error_type, xhr){
if(error_type=='timeout'){
exec(3,callback);
}else{
exec(2,callback);
}
}
});
} // 同check_login 但不需要传login_user_id 和 session_id
function esay_check_login(callback){
var login_user_id = get_login_user_id();
var session_id = get_session_id();
check_login(login_user_id,session_id,callback);
} //判断用户id格式
function check_login_user_id(login_user_id){
return /^[0-9]{4,}$/.test(login_user_id);
} //判断会话id格式
function check_session_id(session_id){
return /^[0-9a-fA-F]{20,40}$/.test(session_id);
} //获取用户id
function get_login_user_id(){
return _get('login_user_id') ? _get('login_user_id') : getCookie('login_user_id');
} //获取会话id
function get_session_id(){
return _get('session_id') ? _get('session_id') : getCookie('session_id');
} //获取当前的时间戳(秒)
//add_sec 可选 为当前时间戳(秒)加上相应的秒数
function get_now_timestamp(add_sec){
var timestamp = Date.parse(new Date())/1000;
if(add_sec && !isNaN(add_sec)){
timestamp += parseInt(add_sec);
}
return timestamp;
} //判断状态是否超时
function status_is_expire(){
var now_timestamp = get_now_timestamp();
return status_exprie_timestamp && now_timestamp>=status_exprie_timestamp ? true : false;
} //获取query参数方法
function _get(name){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
} //设置状态、超时时间 且 调用回调函数
function exec(_status,callback){
status = _status;
status_exprie_timestamp = get_now_timestamp(default_exprie_time);
callback(status);
} //获取指定名称的cookie
function getCookie(name){
var arr=document.cookie.split('; ');
if(!arr)return false;
for(var i=0;i<arr.length;i++){
var one=arr[i].split('=');
if(one[0]==name)return one[1];
}
return false;
} //抛出变量、方法
window.check_login = check_login;
window.esay_check_login = esay_check_login;
window.LOGIN_SUCC = 1;
window.LOGIN_FAIL = 2;
window.LOGIN_TIMEOUT = 3;
})();

调用方法

check_login(login_user_id,session_id,function(status){

if(status == LOGIN_SUCC){
//xxx
}else if(status == LOGIN_FAIL){
//xxx
}else if(status == LOGIN_TIMEOUT){
//xxx
} });

js 检查登录态方法封装(闭包、状态缓存)的更多相关文章

  1. iOS OC和JS的交互 javaScriptCore方法封装

    一.javaScriptCore javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的 ...

  2. 前端js重组树形结构数据方法封装

    不知道大家平时工作中,有没有遇到这样一种情况:后端接口返回的数据,全都是一维的数组,都是平铺直叙式的数据,业务需求却要你实现树形结构的功能.那么,针对这种情况该怎么办呢?是跟后台好好沟通一下呢,还是沟 ...

  3. js浮点数保留位数方法封装

    大家在平时业务中应该经常跟小数打交道吧,有没有被小数点的保留位数问题搞得头疼啊.比如,保留一位小数,保留俩位小数,保留三位小数,向上取整.四舍五入等等. 而我最近在项目中正好遇到类似的问题:有的地方要 ...

  4. 封装getByClass(JS获取class的方法封装为一个函数)

    获取方法一(普通版) 获取单一的class: function getByClass(oParent, sClass) {//两个形参,第一个对象oParent 第二个样式名class var aEl ...

  5. 完整且易读的最新版小程序登录态和检验注册过没的app.js写法

    目录 0.可参考的官方页面 1.流程 2.app.js代码 3.java后台怎么通过code获取openId 0.可参考的官方页面 获取登录凭证:https://developers.weixin.q ...

  6. 微信小程序API~检查登录状态

    wx.checkSession(Object object) 检查登录态是否过期. 通过 wx.login 接口获得的用户登录态拥有一定的时效性.用户越久未使用小程序,用户登录态越有可能失效.反之如果 ...

  7. 微信小程序之登录态维护(十一)

    [未经作者本人同意,请勿以任何形式转载] >什么是登录态? 所谓登录态,就是程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法. 我们知道,WEB服务器通过浏览器携带的cookie获取s ...

  8. flask 实现登录 登出 检查登录状态 的两种方法的总结

    这里我是根据两个项目的实际情况做的总结,方法一(来自项目一)的登录用的是用户名(字符串)和密码,前后端不分离,用form表单传递数据:方法二用的是手机号和密码登录,前后端分离,以json格式传递数据, ...

  9. SpringBoot开发十三-检查登录状态

    需求介绍-检查登录状态 防止用户知道我们的一些功能的链接,直接就进到了该页面,就像有些功能是管理员访问才能进的,就需要进行登录状态的判断. 我们知道这个功能点很多其他的功能点都需要使用,所以我们需要使 ...

随机推荐

  1. HT for Web框架使用心得

    一.简单介绍 在HT for Web的官网首页写着,构建先进2D和3D可视化所需要的一切. 是的,只要你看过官网,你就会知道,这是一个企业的.并非开源的且需要收费的框架. 因为公司的业务需要,且公司使 ...

  2. Django之分页

    需要知道:每页多少条数据.一共多少条数据.一共需要多少页.每页从哪开始到哪结束 注意问题:1.用户输入页码为非数字.  2.用户输入页码超出页码范围 def books(request): try: ...

  3. .Net IOC框架入门之三 Autofac

    一.简介   Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个 目的 1.依赖注入的目的是为了解耦. 2.不依赖于具体类,而依赖抽象类或者接口,这叫依赖倒置. 3.控制反转即 ...

  4. centos7环境下apache2.2.34的编译安装

    .获取apache2..34的源码包 http://archive.apache.org/dist/httpd/httpd-2.2.34.tar.gz .获取apache的编译参数 apache的编译 ...

  5. ubuntu的磁盘扩容

    前言:以前项目的人给ubuntu虚拟机分配磁盘空间走的默认,导致后期/根和swap空间跟不上需求,需要扩容 流程如下: 1.先添加块硬盘,命令行输入fdisk -l,会发现多了个/dev/sdb(vd ...

  6. 2018秋季C语言学习总结

    2018秋季开始学习c语言 1.printf格式化输出函数 2.基本数据类型,int整型,float浮点型,double双精度浮点型,char字符型 3.算数运算符 +加法,-减法,*乘法,/除法,% ...

  7. 使用AltSearch格式化Kindle读书笔记

    AltSearch是LibreOffice Writer的一个用于自动化执行复杂文本替换操作的扩展,能够在不需要复杂编程的条件下进行一些文档格式的手动与批量转换和调整.该扩展除了支持普通文本与正则表达 ...

  8. Codeforces 1098B. Nice table 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1098B.html 题解 首先,我们来证明一个结论: 合法的矩阵要么满足每列只有两种字符,要么满足每行只有两 ...

  9. Python 实现 动态规划 /斐波那契数列

    1.斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数 ...

  10. 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...