解决跨越之“Vue-Cli配置跨域代理”,如何让token持久化的vue版本

953 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

为什么会出现跨域?

只要域名端口协议有一个不同, 就是跨域了~

当下, 最流行的就是**前后分离开发项目,也就是前端项目后端接口**并不在一个域名之下,

那么前端项目开发时, 去访问后端接口就会存在**跨域**的行为.

解决开发环境的跨域问题

开发环境的跨域

开发环境的跨域,也就是在**vue-cli脚手架环境**下开发启动服务时,我们访问接口所遇到的跨域问题,

vue-cli为我们在本地**开启了一个服务,可以通过这个服务帮我们代理请求**,解决跨域问题

vue-cli的配置文件即**vue.config.js**,这里有我们需要的 代理选项

module.exports = {
  devServer: {
    // 代理配置
    proxy: {
        // 这里的api 表示如果我们的请求地址有/api的时候,就出触发代理机制
        '/api': {
          target: 'http://www.baidu.com', // 我们要代理请求的地址
           // 路径重写
          pathRewrite: {
              // 路径重写  localhost:8888/api/login  => www.baidu.com/api/login
              '^/api': '' // 假设我们想把 localhost:8888/api/login 变成www.baidu.com/login 就需要这么做 
          }
      },
    }
  }
}

以上就是我们在vue-cli项目中配置的代理设置

接下来,我们在代码中将要代理的后端地址变成 后端接口地址

 // 代理跨域的配置
proxy: {
  // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
  '/api': {
    target: 'http://ihrm-java.itheima.net/', // 跨域请求的地址
  }
}

本节注意:我们并没有进行**pathRewrite, 因为后端接口就是ihrm-java.itheima.net/api**这种格式,所以不需要重写

**vue.config.js**的改动如果要生效,需要进行重启服务

同时,还需要注意的是,我们一定要注释掉(或删除) mock的加载,因为mock-server会导致代理服务的异常

// before: require('./mock/mock-server.js'),  // 注释mock-server加载

修改请求地址, 走代理

const loginUrl = 'http://localhost:8888/api/sys/login' // 走代理
this.$request.post(loginUrl, this.loginForm).then(res => {
  console.log(res)
})

最终效果图:

生产环境的跨域

生产环境表示我们已经开发完成项目,将项目部署到了服务器上,这时已经没有了vue-cli脚手架的**辅助**了,

我们只是把打包好的**html+js+css**交付运维人员,放到服务器而已, 如果此时还是跨域,

一般可以借助**Nginx**进行代理, 请阅读这篇文章Nginx反向代理, 或者后台开启 cors

提交代码

注意:我并没有进行**pathRewrite,因为后端接口就是ihrm-java.itheima.net/api**这种格式,所以不需要重写

vuex持久化

刚才在登录时, 已经可以成功的将token存到 vuex 中了, 但是 vuex 刷新会丢失, 所以需要结合web存储进行持久化

之前我们是用的localStorage存的token, 这里用cookie 也能存token

且在**utils/auth.js中,基础模板已经为我们提供了获取token,设置token,删除token**的方法,可以直接使用

只需要将存储的key放置成特定值即可

import Cookies from 'js-cookie'

const TokenKey = 'hrsaas_hm_75_token'

export function getToken() {
  return Cookies.get(TokenKey) || null
}

export function setToken(token) {
  return Cookies.set(TokenKey, token)
}

export function removeToken() {
  return Cookies.remove(TokenKey)
}

1 一进来优先从缓存cookie中取

const state = {
  // 一进来优先从缓存中取
  token: getToken() || '' // token字符串或兜底字符串
}

2 vuex中存token时, 也同步存到cookie中

import {settoken,gettoken} from '@/utils/auth.js'
const mutations = {
  // 设置token
  setToken(state, newToken) {
    state.token = newToken
    // 设置了 token 的同时, 同步到本地cookies中
    setToken(newToken)
  }
}

效果: 刷新后, token 还是有的, 持久化存储了