美文网首页
接口返回302 Found

接口返回302 Found

作者: 黎明的叶子 | 来源:发表于2021-11-04 14:30 被阅读0次

问题描述:单点登录的时候,前端去请求接口,返回 status Code : 302 Found。如下图。但是如果设置请求头X-Requested-With为XMLHttpRequest的话。接口就可以返回200。并含有返回信息。以下分析一下原因。

接口返回图

环境

vue项目,axios请求。
首先,如果不加以上请求头的话,返回的是302。这个时候在axios里面是报错的,直接走error。且response为undefined的,status为0。如下图(问题:为什么返回到status和接口显示到status code 不一致?)

image.png
axios本质也是ajax的请求。那用ajax请求会不一样吗? 答案是一样的。
如下ajax代码。请求返回的status也是0。这里说明一点。跟默认是axios请求或者ajax请求没关系。返回的都是一样的。(网上有说明说ajax会自动加这个请求头,我在谷歌下验证。并没有。)
return new Promise((resolve, reject) => {
    var xhr = new XMLHttpRequest
    xhr.open(option.method, baseUrl + option.url, true)
    // xhr.setRequestHeader('X-Requested-With','XMLHttpRequest')
    xhr.onreadystatechange = function () { 
      console.log(xhr.status) // 返回为0
      console.log(xhr.responseText)
      if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText)
        resolve(xhr.responseText)
      } else {
        reject(xhr)
      }
      
    }
    xhr.send(null)
  })

其次,加上请求头设置。
axios

// 官网有写法
axios.get(url,{headers: {'X-Requested-With': 'XMLHttpRequest'}})

ajax

// 在xhr.open之后写这个代码。不然报错,要求是xhr得opened 
xhr.setRequestHeader('X-Requested-With','XMLHttpRequest')

这个时候返回的是200,且能获取返回的信息。前端应该根据信息去重定向。
原因
X-Requested-With请求头用于在服务器端判断request来自Ajax请求还是传统请求(包括表单提交,a标签 img标签等)。
我的理解是即便不加这个请求头,我们发送的也是ajax请求,但是服务器不知道,所以是服务器强制要求,加上这个会判断为ajax请求。目前我们的项目,是通过单点登录系统做了一层拦截。也就是单纯的后台系统来判断的,如果不加这个请求头,单点登录系统就拦截到,直接给302了。如果加上了,就可以正确访问我们的接口,这个时候才能走到接口里面,拿到正确的返回值。 这里再判断是否登录过,返回不同的值。

就是这样的,可能也许大概吧

相关文章

网友评论

      本文标题:接口返回302 Found

      本文链接:https://www.haomeiwen.com/subject/clqrzltx.html