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

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

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了。如果加上了,就可以正确访问我们的接口,这个时候才能走到接口里面,拿到正确的返回值。 这里再判断是否登录过,返回不同的值。

网友评论