后端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

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

  1. js实现未登录用户跳转到登录页面登录完成后返回原页面

    首先要获取未登录用户浏览的当前页面的路径: var preUrl=window.location.href; 在提示登录的跳转链接里利用url传参: window.open("../logi ...

  2. Linux登录输入密码后返回登录界面

    问题: 登录Linux时,输入的密码正确,但是屏幕闪两下后又返回登录界面,进不了桌面. 原因: 用户目录下的.Xauthority文件权限变成root,登录时无法读取,使用ls命令查看,所有者是roo ...

  3. uniapp之 登录成功后返回之前页面

    目录 前言 分析 第一步 代码 代码 一 方式二 温馨提示 小结 前言 在完善小程序效果时,想新增一个当用户没有登录时 点击跳转到某个页面实现交易啊,或者添加什么功能时,检验有没有登录 若没有的话 , ...

  4. 防止登录成功后重复刷新页面跳回登录页面

    登录action:system/Syslogin/sysLogin.do public String sysLogin() { try { //验证码验证 String yzm = Struts2Ut ...

  5. 西门子SMART LINE触摸屏用户密码失效,无法登录的解决办法

    西门子SMART LINE触摸屏用户密码失效,无法登录的解决办法 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 有小伙伴反映,在使用SMART触摸 ...

  6. java session失效之后跳转_详解springmvc控制登录用户session失效后跳转登录页面

    springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下: 第一步,配置 web.xml 15 第二步,配置spring-mvc.xml 第三步,写拦截器SystemSe ...

  7. php ajax session,Ajax处理用户session失效

    这次给大家带来Ajax处理用户session失效,Ajax处理用户session失效的注意事项有哪些,下面就是实战案例,一起来看一下. 在使用spingMVC的拦截器来处理用户session失效的问题 ...

  8. 解决 Adobe Acrobat Pro DC更新后提示登录激活问题

    解决 Adobe Acrobat Pro DC 更新后提示登录激活问题 问题描述 解决方法 问题描述 Adobe Acrobat Pro DC在安装的时候使用"AMTEmu v0.9.2&q ...

  9. Spring Security 实战:登录成功后返回 JWT Token

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 170元买400元书的机会又来啦! 1. 前言 欢迎阅读 Spring Security 实 ...

最新文章

  1. 如何利用BP网络进行神经网络变量筛选
  2. 4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
  3. java accept encoding_Accept-Encoding gzip 乱码 和Okhttp的解决方法
  4. BZOJ4571:[SCOI2016]美味——题解
  5. Java中的异步等待
  6. python 字符串交集_Python序列--集合(set)
  7. asp.net 安装element ui_不用上官网,自己部署一套Element官方最新文档
  8. jmeter通过ant执行时报错 jmeter.log not found
  9. pythonopencv人脸相似度_图像相似度算法的个人见解(pythonopencv)-Go语言中文社区...
  10. 简述软件黑盒测试的方法,简述什么是黑盒测试方法
  11. 简单阻抗匹配电路及公式
  12. Excel技巧—快速插入空行技巧大集合
  13. day11_rabbitmq和redis
  14. 什么是API、什么是SDK、他们有什么区别?
  15. 玩转 Windows 10 中的 Linux 子系统
  16. spectral clustering谱聚类论文解读(上)
  17. 【论文】Saliency Detection: A Spectral Residual Approach阅读笔记
  18. 浙江环宇集团“营改增”项目启动会成功举办
  19. 了解Panda3D引擎的配置变量
  20. 经营者思维—赢在战略人力资源管理

热门文章

  1. Andrid打印数组的方法
  2. IPv6 tcp socket HBH扩展报头设置
  3. Docker前世今生
  4. Win10如何禁用Windows Defender
  5. jQuery 中的filter 运用
  6. Centos卸载安装rpm
  7. 鸿蒙手机内存,一图看懂鸿蒙2.0:终于上手机、128KB内存就能跑!
  8. 牛客 24086 Haybale Feast
  9. 1分钟搭建VPN服务器
  10. Android逆向之旅---微信封了抖音分享功能,而我要把短视频分享到朋友圈!