解决AJAX在用户登录失效后返回登录页面的问题

   后端AJAX API,Session过期,登录失效,直接跳转(redirect)到登录页。(后端Shiro、Spring Security等都支持这个功能)

 

    对于全站AJAX的应用,当然不存在redirect重定向到登录页面的做法(建议直接返回HTTP Code 401),但是对于某些前后端没有分离的应用,当用户session失效时,后端可能会重定向到登录页面。那对于ajax请求,后端重定向后,返回的ajax内容是一个html页面,怎么办呢?

    总体的思路是在ajax工具的拦截器中做一些特殊的判断。

1、jquery ajax的具体解决办法(示例)如下:

//全局配置

$.ajaxSetup({

    dataType: "json",

    contentType: "application/json",

    cache: false,

    complete: function (jqXHR, status) {

      if(jqXHR.status==200) {

        return;

      }

      if(jqXHR.status==401) {

        var loginPage = 'sys/logout';

        // 处理iframe页面

        if (top) {

          top.location = loginPage

        } else if (parent) {

          parent.location = loginPage

        } else {

          window.location = loginPage

        }

      }

      if(jqXHR.status==403) {

        alert('对不起,你没有权限,若有疑问请联系管理员。<br/>(Access is not allowed. HTTP CODE: 403)');

      }

      if(jqXHR.status==500) {

        alert('请求出错啦,请稍后再试试看。<br/>(Server internal error. HTTP CODE: 500)');

      }

      if(jqXHR.getResponseHeader("content-type") == "text/html") {

        document.write(jqXHR.responseText);

        document.close();

      }

  }

});

代码说明,注意到最后一个if,判断如果ajax返回的是一个页面,则直接document.write显示(如果是登录页,就会直接替换到当前的其他页面)。

 

2、axios的判断方法如下(原理一样):

axiosInstance.interceptors.response.use(

  response => {

    console.log(response)

    // session 超时....

    if (response.status === 401

        || response.headers['content-type'] === 'text/html') {

 

      store.dispatch('FedLogOut')

    } else {

      return response

    }

  },

  error => {

    console.log(error)

    // 若path为登录url,则跳转

    if(error.response.path='/login.html') {

      store.dispatch('FedLogOut')

    }

    return Promise.reject(error)

  }

)

    原理同上面一样,只不过在error处,也做了一个判断。因为后端页面重定向时,在axios中,是不会执行response =>{...}的,但是error=>{...}函数会执行。这个方法官方文档没说明,也是我摸索了十几分钟才试出来的。特此记录分享出来。

 

    另外,后端也有进一步优化的空间——那就是精确判断Request请求是否为AJAX类型。如果是AJAX请求则未登录时返回401状态码,如果不是AJAX请求,则重定向到登录页面。

    优化空间在于,怎么尽量准确地判断请求是否为AJAX类型?我写了一个Java方法如下:

/**

 * 判断是否为Ajax类型的请求(支持jquery,其他方式未测试过)

 */

public static boolean isAjaxRequest(HttpServletRequest request) {

    String header = request.getHeader("X-Requested-With");

    if (header != null && "XMLHttpRequest".equals(header)) {

        return true;

    }

    return false;

}

    注意看代码注释,很显然,这个方法不够准确,甚至在某些情况下完全失效。

    那怎么办呢,可以根据Header内容来判断,通常AJAX请求的header里面有一些特点的内容,这有助于精确判断请求是否为AJAX类型。另外,判断header中accept的值,如果是类似下面的格式(以application/json开头),通常都是AJAX请求:

// ajax

application/json, text/javascript, */*; q=0.01

application/json, text/plain, */*

// 非ajax

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本功能: 已经在程序中集成支付宝(担保交易/双功能接口/即时到帐)、银联、paypal、财付通、微信支付(扫码支付)、个人免签约支付(点击申请接口) 集成mycred积分插件,mycred积分兑换成erphpdown货币(另付费功能)购买此扩展 充值卡充值(管理员后台生成充值卡卡号卡密,可以放在第三方自动发卡平台出售,然后购买用用卡密来进行网站充值)(另付费功能)购买此扩展 设置会员提现手续费比率 设置支付宝异步处理订单 设置用户推广消费提成比率 设置货币昵称(例如:模板币) 设置充值比例(例如:1元=10模板币) 查询所有消费记录 查询所有充值记录 查看与处理取现申请列表 查看全部收益与推广 推广用户消费获得提成(这对管理员没必要) 后台所有资源列表,ajax修改价格 用户充值与扣费 查询用户余额、充值记录、消费记录 发布收费下载资源(支持外链,可设置解压密码,通过email发送给购买用户) 发布收费查看内容(支持全文内容收费查看以及部分内容收费查看) 在消费清单中下载资源 管理与、投稿者、订阅者权限分配(以上某些功能是管理员专有权限) 前端短代码调用 其他功能: 下载路径加密(内链) 申请提现 VIP会员(包月、包季、包年、永久)特权(VIP专享、VIP半价、VIP八折、VIP免费) 一次购买,永久下载 colorbox灯箱弹窗特效 前端个人中心(可直接充值、查看消费等) 更新记录: 修复bug,下载地址可设置网盘名称以及提取码 (v9.2.4 2018.05.28) 修复bug,下载面显示资源标题 (v9.2.3 2018.05.24) 修复上个版本VIP免费下载记录无法记录的bug,新增虎皮椒个人支付宝/微信免签即时到账接口 (v9.2.2 2018.05.07) 修复9.2版外链下载的bug (v9.2.1 2018.04.12) 新增下载过期时间,更换mcrypt加密内链下载地址方法,新增作者发布收费资源售卖分成(需要设置分成比例) (v9.2 2018.04.09) 修改bug (v9.1.4 2018.02.02) 修复VIP免费下载次数限制bug (v9.1.3 2018.01.24) 新增后台VIP免费下载资源记录列表 (v9.1.2 2017.12.27) 修复bug (v9.1.1 2017.08.21) 新增一款个人支付接口,移除一款支付接口(支持支付宝与微信,详情请看插件里的接口设置),此版本可以设置支付完成后返回面(erphpdown-显示设置 里设置)。 (v9.1 2017.08.01) 赠送的前端用户中心新增mycred积分兑换,简单适配手机端前端用户中心 (v9.0.4 2017.03.27) 增加支付宝官方接口支付的同步处理充值逻辑(为了暂时解决部分用户网站支付宝官方接口异步处理概率性失效问题) (v9.0.3 2017.03.21) 修复mycred积分兑换的bug (v9.0.2 2017.02.10) 新增VIP免费下载资源限制每天总下载资源个数(仅对VIP专享、VIP免费、包年VIP免费、终身VIP免费的资源有效)(使用此版本必须重启下插件),后台新增清理数据表冗余数据,修复erphpdown短代码支持嵌套其他短代码,修复微信支付的bug (v9.0.1 2016.12.8) 新增自定义文章类型的支持(后台ErphpDown - 显示设置里可设置)、新增支付宝免签约即时到帐接口的支付结果通知、优化插件结构(为后面开放API文档做准备),更新前端用户中心面文件。此次更新需要用户自行修改一些东西,具体请看下载包里的更新说明文档。模板兔建议此次升级流程:停用插件 - 删除旧插件 - 上传新插件 - 启用新插件,删除插件不会影响网站已存在的数据 (v9.0 2016.11.23)(PS:下个版本还会有惊喜哦~~) 新增后台VIP用户查询功能、所有推广用户记录,修复可能会出现重复购买的bug,赠送的前端用户中心支持VIP推广提成(需要使用新版的前端用户中心文件) (v8.3.2 2016.09.27) 增加充值订单号长度(避免订单号重复),此升级可能会导致无法自动充值成功,若出现此问题,请重启下插件。若无法解决,请进网站数据库管理(phpmyadmin)修改数据表wp_ice_money 的ice_num字段,若是int类型,请改成varchar,长度改为50 (v8.3.1 2016.08.29) 新增支付宝免签约即时到帐接口,详情请看插件后台Erphpdown-账号设置 (v8.3 2016.08.27) 修复部分老用户网站无法自动处理支付结果的bug (v8.2.1 2016.08.08) 新增年费VIP与终身VIP免费权限,移除购买时发邮件功能 (v8.2 2016.06.28) 优化代码 (v8.1.1 2016.05.21) 更新用户前端文件至8.1版本,前端支持充值卡充值 (v8.1 2016.05.08) 优化充值订单号长度(使用此版本必须重启下插件),优化弹窗购买框界面以及下载界面 (v8.0.2 2016.03.30) 修复后台处理提现的bug (v8.0.1 2016.03.14) 新增微信支付,暂时关闭推广点击奖励,优化插件结构(赠送的前端文件修改过,请使用新的前端文件) (v8.0 2016.02.23) 修复文章标题有单引号时导致无法购买的bug,新增支持SSL链接、迅雷下载链接、种子链接 (v7.0.1 2016.01.11) 修复重要bug,请务必升级到此最新版 (v7.0 2015.12.03) 修复用户前端提现不扣费的bug,后台申请的提现不影响 (v6.2.1 2015.11.13) 新增前端升级VIP以及充值地址自定义(适合有前端用户中心的用户) (v6.2 2015.11.11) 新增批量管理所有VIP用户的到期时间,新增收费查看部分文章隐藏内容选项 (v6.1 2015.10.17) 修复后台添加VIP续费的bug (V6.0.1 2015.06.24) 修复收费查看样式错乱以及提现偶尔出现负余额的bug (V6.0 2015.06.20) 修复部分用户数据库无法写入的bug,新增后台VIP用户管理功能 (v5.0 2015.06.17) 修复部分bug (v4.5.2 2015.05.13) 新增下载面直接显示隐藏信息 (v4.5.1 2015.03.31) 支持访问推广链接获得提成(需重启插件方可生效)(v4.5 2015.03.04) 新增VIP会员续费功能,修复后台列表部分bug (v4.4 2015.03.01) 新增资源免费下载功能,修复支付宝担保交易接口跳转的bug (v4.3 2015.01.28) 新增mycred积分兑换(另付费功能,测试版本mycred 1.5.4)购买 (v4.2 2014.11.11) 新增支付宝转账付款,集成erphpdown充值卡(另付费功能)购买 (v4.1 2014.10.09) 优化前台下载样式(v4.0.1 2014.08.13) 新增财付通充值(功能待完美测试)(v4.0 2014.08.01) 优化后台。部分用户在使用过程中函数有冲突,所以修复了一些函数,使用前端面的需要修改下前端里的部分函数名,具体看插件里的更新记录,数据不受任何影响(v3.0.2 2014.05.11) 新增用户购买后直接显示隐藏内容(比如 解压密码)(v3.0.1 2014.04.26) 新增前端个人中心短代码调用(v3.0 2014.04.23) 修复部分主机出现的bug(v2.2 2014.03.21) 修复支付宝异步处理bug(v2.1 2014.03.16) 修复bug、新增注册选项、优化下载(v2.0 2014.03.04) 优化下载(v1.5.4 2014.02.18) 修复bug(v1.5.3 2014.02.07) 修复bug、优化推广(v1.5.2 2014.01.18) 修复bug、新增ajax修改价格、异步处理充值选项、优化付费发布(v1.5 2014.01.04) 新增后台网站所有资源列表(v1.4 2013.12.10) 修复bug(v1.3.2 2013.12.09) 新增站内转账(v1.3 2013.11.29) 注册新增验证码(v1.2.3 2013.11.26) 修复bug(v1.2.1 2013.11.20) 新增收费查看内容(v1.2 2013.11.19) 优化注册,新增密码输入(v1.1.1 2013.11.18) 支持支付宝担保交易(v1.1 2013.11.16) 支持支付宝即时到帐与双功能接口,银联支付,paypal贝宝支付(v1.0 2013.11.10)
原书附带光盘文件第2章 02/ 基于Ajax的留言板示例第3章 03/3.1.3.html JavaScript在Ajax中的作用范例 03/3.4.6.html 加入注释,实现九九乘法表 03/3.4.11.html 使用逻辑表达式范例第4章 04/4.1.2.html 使用if…else…处理条件不成立的情形范例 04/4.1.4.html 使用switch语句进行多重条件判断范例 04/4.1.6.html 使用do…while循环范例 04/4.1.9.html continue语句:停止当前循环进入下一次循环 04/4.2.3.html 给函数传递参数范例第5章 05/5.2.2.html 从Date对象中提取信息范例 05/5.3.2.html 使用随机函数Math.randon()范例 05/5.4.4.html 使用数组的length属性范例 05/5.6.4.html 文档操作初步范例:document对象 05/5.10.2.html 使用复选框范例 05/5.11.12.html 下拉框实例:二级联动的下拉列表菜单第6章 06/6.1.3.html 使用方括号([])引用对象的属性和方法范例 06/6.1.5.html 使用大括号({})语法创建无类型对象范例 06/6.1.6.html prototype原型对象范例 06/6.2.6.html 函数的apply、call方法和length属性范例 06/6.2.7.html 深入认识JavaScript中的this指针范例 06/6.3.2.html 使用prototype对象定义类成员范例 06/6.4.2.html 实现类的私有成员范例 06/6.6.1.html 利用共享prototype实现继承范例 06/6.6.2.html 利用反射机制和prototype实现继承范例 06/6.6.3.html prototype-1.3.1框架中的类继承实现机制范例 06/6.7.2.html 在JavaScript实现抽象类范例 06/6.8.3.html 给事件处理程序传递参数范例 06/6.8.4.html 使自定义事件支持多绑定范例 06/6.9/ 实例:使用面向对象思想处理cookie第7章 07/7.2.3.html 获取cookie的值范例 07/7.2.4.html 给cookie设置终止日期范例 07/7.2.5.html 删除cookie范例 07/7.2.8.html 综合示例:构造通用的cookie处理函数 07/7.4.2.html 使用定时器实现JavaScript的延期执行或重复执行范例 07/7.4.3.html 给定时器调用传递参数范例 07/7.5.3.html 使用throw语句抛出异常范例第8章 08/8.2.7.html 使用responseText获得返回的文本范例 08/8.2.8.html 使用responseXML属性获取范例 08/8.2.9.html 使用abort方法取消一个请求范例 08/8.3.2.html 使用post方法向服务器提交数据范例 08/8.3.3.html 实现服务器相关的二级联动菜单范例 08/a.html 用于ajax获取文件的示例 08/checkUserName.asp 检测用户名的代码文件第9章 09/9.3.1.html 直接引用结点范例 09/9.5.1.html 表格操作范例 09/9.5.5.html 添加单元格范例 09/9.5.8.html 删除行和单元格范例 09/9.5.9.html 交换两行的位置范例第10章 10/10.1.3.html CSS在Ajax开发中的作用 10/10.2.4.html 使用id选择器范例 10/1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值