记录工作中早该加深印象的一个小case: ajax请求不能显式拦截 302响应。

我们先来看一个常规的登录case:

  1. 浏览器请求资源,服务器发现该请求未携带相关凭据(cookie或者token)
  2. 服务器响应302,并在响应头Location写入重定向地址, 指示浏览器跳转到登录页
  3. 浏览器跳转到登录页,提交身份信息,回调到原业务站点,服务端利用Set-Cookie响应头种下cookie或者token

利用axios库发起请求

Axios is a promise-based HTTP Client for node.js and the browser. It is isomorphic (= it can run in the browser and nodejs with the same codebase). On the server-side it uses the native node.js http module, while on the client (browser) it uses XMLHttpRequests.

When you make an HTTP request with axios, the library returns a promise. If the request is successful (i.e. the server responds with a 2xx status code), the promise will be resolved and the then() callback will be called with the response data. On the other hand, if the request fails (i.e. the server responds with a 4xx or 5xx status code), the promise will be rejected and the catch() callback will be called with the error.

  1. axios在浏览器发起的是ajax请求
  2. axios默认认为2xx状态码是成功的响应, 会进入promise的resolved回调函数, 本case第一次会收到302重定向响应, 故添加ValidateStatus配置

伪代码如下:

   axios.request({
method:'get',
url:'/login',
validateStatus: function (status) {
return status >= 200 && status < 300 || status === 302;
},
}).then((resp)=> {
if resp.status ===302 {
window.location.href = resp.headers['Location']
}else{
var userInfo = JSON.parse(
decodeURIComponent(
resp.data.msg || ""
) || "{}"
)
this.setState({
userInfo
})
}
})

实际上以上ajax请求收到的302响应并不能被显式拦截,上面的resp实际是redirect之后的页面的响应体

核心在于:所有浏览器都遵循了ajax标准readystatus=2, All redirects (if any) have been followed and all headers of a response have been received.

翻译下来就是 : ajax收到的响应如果有重定向,必然是重定向逻辑走完之后的响应。


对于这个常规的case, github上给出的思路是: 针对不同类型的http请求,服务端给出不同的状态码。

  if  req.isXhr {
c.JSON(http.StatusForbidden, gin.H{
"code": 403,
"msg": redirectUrl})
}else {
c.Redirect(http.StatusFound, redirectUrl)
}

如果是ajax请求,返回4xx json响应,让浏览器主动重定向。

 axios.defaults.headers.common['X-Requested-With']="XMLHttpRequest";
axios.request({
method: 'get',
url: '/login',
validateStatus: function (status) {
return status >= 200 && status < 300 || status === 403;
},
}).then((resp)=> {
if (resp.status===200 && resp.data.code === 200) {
......
}else{
window.location.href = resp.data.msg
}
})

不能显式拦截ajax请求的302响应?的更多相关文章

  1. MOCK.JS 生成随机数据,拦截 Ajax 请求

    mock.js 的用处 前后端分离 :让前端攻城师独立于后端进行开发. 增加单元测试的真实性 :通过随机数据,模拟各种场景. 开发无侵入 :不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响 ...

  2. Mock拦截ajax请求

    //mock拦截ajax请求 ,生成随机数据Mock.mock('./servlet/UserServlet?method=getUser',{ 'list|1-5':[{ 'username':'@ ...

  3. 图文并茂quasar2.6+vue3+ts+vite创建项目并引入mockjs,mockjs 拦截ajax请求的原理是什么,quasar为什么要使用boot?

    每天都要开心(▽)哇: 首先呢,我们来创建项目 执行下面命令,开始创建项目啦 $ npm i -g @quasar/cli $ npm init quasar 下面是我的选项,仅供参考哇 √ What ...

  4. 解决ajax请求(SpringMVC后台)响应415/400/405错误

    解决ajax请求(SpringMVC后台)响应415/400/405错误 后端代码 bean public class user { private String username; private ...

  5. mockjax MOCK.js的拦截ajax请求

    今天看了下 mock.js的拦截请求 .https://github.com/nuysoft/Mock/blob/master/src/mockjax.js //覆盖(拦截) Ajax 请求,目前内置 ...

  6. java Servlet Filter 拦截Ajax请求

    /** * 版权:Copyright 2016-2016 AudaqueTech. Co. Ltd. All Rights Reserved. * 描述: * 创建人:赵巍 * 创建时间:2016年1 ...

  7. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题

    后台增加filter,注意不要把druid也屏蔽了 import java.io.IOException; import javax.servlet.Filter; import javax.serv ...

  8. filter 拦截ajax请求

    1.filterpublic class SessonFilter implements Filter { private static Logger log = LoggerFactory.getL ...

  9. session过期,拦截ajax请求并跳转登录页面

    1.方法一 :1.1使用filter 和ajaxsetup 对ajax进行拦截并跳转登录页面 public void doFilter(ServletRequest request, ServletR ...

  10. JSF拦截ajax请求并传递参数方法

    我们可以利用f:ajax做一些简单的ajax操作,但是遇到复杂的逻辑,它不能简单的去实现,jsf提供了一种方法,可以调用它内部的js方法去实现复杂的逻辑. 首先要在页面引入jsf的js文件: < ...

随机推荐

  1. requests Python中最好用的网络请求工具 基础速记+最佳实践

    简介 requests 模块是写python脚本使用频率最高的模块之一.很多人写python第一个使用的模块就是requests,因为它可以做网络爬虫.不仅写爬虫方便,在日常的开发中更是少不了requ ...

  2. 如何让一句话木马绕过waf ?

    一.什么是一句话木马? 一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能.为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令. ...

  3. node使用jsonwebtoken生成token与验证是否过期

    场景 我们可以使用 cookie,session,token 来做鉴权. 下面我们来看一下, 如何使用 token 来做鉴权 jwt.sign 的简单介绍 npm install jsonwebtok ...

  4. 【Linux】部署Nginx

    1.先安装gcc-c++编译器 yum install gcc-c++ yum install -y openssl openssl-devel 2.再安装pcre包 yum install -y p ...

  5. 【原创】从Ubuntu-base构建ubuntu rootfs系统(以x86_64和arm为例)

    版权声明:本文为本文为博主原创文章,转载请注明出处,博客地址:https://www.cnblogs.com/wsg1100/.如有错误,欢迎指正. 目录 1.介绍 2.目的 2.准备宿主系统 2.1 ...

  6. webshell工具流量特征

    常见的webshell管理工具及流量特征 菜刀 作为老牌 Webshell 管理神器,中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场景中越来越少使用,加密 Webshell 正变得日趋流行 ...

  7. Linux Crontab 使用单行命令需要注意使用命令的绝对路径

    crontab 中不支持||的写法,但是支持&&所以用 xxx ; [ $? -ne 0] && xxx的格式就没有问题. crontab 中环境变量与shell中不一 ...

  8. 2021-4-19 vs加速启动小技巧之intellitrace

    在选项界面中将intellitrace的启用关闭后对于程序的打开有加速作用.

  9. SpringBoot里的Servlet和实现

    Servlet 接口,一个规范, SpringBoot Spring Boot 是 Spring 的子项目,正如其名字,提供 Spring 的引导( Boot )的功能. 通过 Spring Boot ...

  10. 人工智能如何应对 DevOps 监控和可观测性挑战

    自 ChatGPT 横空出世之后,AIGC 已成为不可逆转的时代浪潮.在之前的文章中,我们介绍了DevOps 领域中AI的用例,需要回顾可以点击下方链接.在本篇文章中,我将简单聊聊人工智能(AI)如何 ...