使用axios带cookie后请求报跨域,后端使用shiro。

发布于 2022-09-11 21:06:26 字数 2516 浏览 29 评论 0

接手一个项目,登录部分后端使用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 但是可以拿到请求结果,却被请求拦截器报错了

clipboard.png



network 如下

clipboard.png



后来我又把登录那的接口改了

    // 登录
    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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文