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的 那是不是一定会报错
  • 这种情况前端该怎么做
2019-07-16 提问
0 个回答

撰写答案

推广链接