使用axios带cookie后请求报跨域,后端使用shiro。
接手一个项目,登录部分后端使用shiro安全框架
交给我的时候axios用的webpack的proxy,但是在生产环境中使用不了proxy
所以只能老老实实写URL。
但是出现了一问题,使用proxy代理时,
登录后cookie自动被写入SHIROSESSIONID
贴代码
// webpack-dev-server 相关配置
devServer: {
open: false,
port: 8080,
https: false,
hotOnly: false,
proxy: {
"/api": {
target: Url,
ws: false,
changeOrigin: true,
pathRewrite: {
'^/api': ""
}
}
}
然后在fetch中引用proxy的'/api'
let Url = require("../../public/projectConfig").Url
const service = axios.create({
baseURL: process.env.NODE_ENV === 'production' ? Url : '/api',
timeout: 10000 // 请求超时时间
});
这么写开发环境下一切正常,但是打包之后因为proxy失效,请求不能用。
后来后端告诉我 当我使用代理的时候 cookie里会有 SHIROSESSIONID
这个数据 。
但是这条数据我并没有手动保存,感觉像是proxy自动保存的
因为shiro框架需要根据cookie判断登录身份,所以就让后端把sessionid发给我我来手动保存。
然后这么写
API.login(this.ruleForm)
.then(res => {
let sessionId = res.data
setCookie("SHIROSESSIONID",sessionId)
this.$message.success("登录成功");
this.$router.push("/clue");
})
后来发现如果需要再请求里携带cookie 需要再设置axios
axios.defaults.withCredentials = true
但是这么一写,因为第一次登录请求没有cookie,所以直接
network error 但是可以拿到请求结果,却被请求拦截器报错了
network 如下
后来我又把登录那的接口改了
// 登录
login(data) {
return fetch({
url: 'login',
method: 'get',
params: data,
withCredentials:false // 此接口的withCredentials和其他接口不一样
})
},
此时其他的接口withCredentials = true
然后登录不报错,进首页后查询其他的接口能拿到数据,却依然报错。
然后进入拦截器的error
如果不设置withCredentials = true的话,那后台返回登录超时
因为没能从cookie里拿到SHIROSESSIONID
我百度了好久,好像是因为Access-Control-Allow-Origin不能用通配符*
需要指定ip地址
有几个问题求大佬们解答
- 为什么使用proxy时一切正常,并且自动的往cookie里写入SHIROSESSIONID
- 网上查找withCredentials = true时才可以携带cookie,如果第一次登录请求是没有cookie的 那是不是一定会报错
- 这种情况前端该怎么做
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论