【前端请求头中的Authorization和Cookie是如何设置的】

以一个简单的功能举例,探究前端请求头中的Authorization和Cookie是如何设置的。

以后再写新的系统时,可以让gateway网关进行统一管理,不再暴露具体的端口号。
在这里插入图片描述
后端的代码已经看过了,这里主要是前端。

这里主要是在 ruoyi-ui/src/utils/request.js 里进行配置的。

这里设置了一个请求拦截器,所有的请求都会先走这个拦截器。

// request拦截器
service.interceptors.request.use(config => {
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false
  if (getToken() && !isToken) {
    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  // get请求映射params参数
  if (config.method === 'get' && config.params) {
    let url = config.url + '?' + tansParams(config.params);
    url = url.slice(0, -1);
    config.params = {};
    config.url = url;
  }
  return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

可以看到,这个拦截器在前端向后端发送请求的时候,先设置了token。

那么cookies是怎么设置的呢。

其实Cookies是在ruoyi-ui/src/views/login.vue文件中定义的。

在这里插入图片描述
可是这里只设置了三个值:usernamepasswordremeberme

另外两个值,Admin-TokenAdmin-Expires-In是哪来的?

其实,它们是在ruoyi-ui/src/utils/auth.js里设置的。

import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

const ExpiresInKey = 'Admin-Expires-In'

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

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

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

export function getExpiresIn() {
  return Cookies.get(ExpiresInKey) || -1
}

export function setExpiresIn(time) {
  return Cookies.set(ExpiresInKey, time)
}

export function removeExpiresIn() {
  return Cookies.remove(ExpiresInKey)
}

可以看到,auth.js里定义了2个变量:TokenKeyExpiresInKey

那么,它们是在哪里进行初始化的呢?

再找一通,最后发现是在ruoyi-ui/src/store/modules/user.js

Login({ commit }, userInfo) {
      const username = userInfo.username.trim()
      const password = userInfo.password
      const code = userInfo.code
      const uuid = userInfo.uuid
      return new Promise((resolve, reject) => {
        login(username, password, code, uuid).then(res => {
          let data = res.data
          setToken(data.access_token)
          commit('SET_TOKEN', data.access_token)
          setExpiresIn(data.expires_in)
          commit('SET_EXPIRES_IN', data.expires_in)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },

user.js里定义了setToken()方法。

可是这个Login方法是在哪里用到的呢?

再仔细找找,兜兜转转,最后又回到了登录界面:ruoyi-ui/src/views/login.vue

可以看看,登录页面中对于登录动作是如何处理的。

handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true;
          if (this.loginForm.rememberMe) {
            Cookies.set("username", this.loginForm.username, { expires: 30 });
            Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
            Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
          } else {
            Cookies.remove("username");
            Cookies.remove("password");
            Cookies.remove('rememberMe');
          }
          this.$store.dispatch("Login", this.loginForm).then(() => {
            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
          }).catch(() => {
            this.loading = false;
            if (this.captchaOnOff) {
              this.getCode();
            }
          });
        }
      });
    }
  }
};

登录逻辑:

  1. 当输入用户名,密码后,如果点击记住密码,那么就会往cookies中设置用户名和密码,随后将请求转发到Login方法进行处理(该方法定义在ruoyi-ui/src/store/modules/user.js中。)
  2. Login中实际上是调用ruoyi-ui/src/api/login.js中的login(username, password, code, uuid)方,获取token
  3. 然后再调用ruoyi-ui/src/utils/auth.jssetToken(token)的方法进行赋值。
  4. 全局request拦截器,会把每次请求中都加上Authorization
### 如何在前端HTTP请求中设置Cookies 当浏览器发送HTTP请求给服务器时,可以通过`Set-Cookie`响应头接收来自服务器的Cookie,在后续请求中自动将其包含在内。然而,有时需要手动控制这些Cookies,尤其是在发起AJAX请求或其他形式的异步通信时。 #### 使用JavaScript设置请求头中的Cookies 对于同源请求,可以利用XMLHttpRequest对象轻松地向服务器传递额外的信息: ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://example.com/api/data'); xhr.withCredentials = true; // 发送凭证(包括cookies) xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); // 自定义头部字段 xhr.send(); ``` 为了确保跨站脚本攻击的安全性,默认情况下不会随请求一起发送认证信息(如Cookies),除非显式设置了`withCredentials=true`属性[^2]。 #### 利用Fetch API操作Cookies 现代Web开发更倾向于采用基于Promise的Fetch接口来进行网络交互。下面是一个带有Cookies的例子: ```javascript fetch('https://example.com/api/resource', { method: 'POST', credentials: 'include', // 或者'omit','same-origin' headers: { 'Content-Type': 'application/json;charset=UTF-8', 'Authorization': 'Bearer your_token_here' }, body: JSON.stringify({ key: value }) }) .then(response => response.json()) .catch(error => console.error('Error:', error)); ``` 这里的关键在于`credentials`选项的选择——它可以接受三个不同的值:`'omit'`, `'same-origin'`, `'include'`。这决定了哪些类型的资源应该附带用户的凭据数据(即Cookies)[^3]。 #### 跨域资源共享(CORS) 需要注意的是,当涉及到不同域名之间的资源访问时(即所谓的CORS场景),服务端也需要做相应的配置才能允许客户端带上Cookies。具体而言,服务器应当在其响应报文中加入如下两个首部之一或全部: - `Access-Control-Allow-Origin`: 指定可信任的来源地址; - `Access-Control-Allow-Credentials`: 设置为true表示同意接收包含用户身份验证信息在内的请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值