axios 自定义添加请求头 单独添加请求头

axios 自定义添加请求头

axios 封装

import Vue from 'vue'
import axios from 'axios'

axios.defaults.timeout = 5000;
axios.defaults.baseURL = process.env.VUE_API_ROOT; 

// 请求拦截
axios.interceptors.request.use((config) => {
  let userToken = window.localStorage.getItem('token');
  if (userToken) {
    config.headers.common['Authorization'] = userToken;
  }
  return config;
}, (error) => {
  console.log('错误的传参')
  return Promise.reject(error);
});

// 响应拦截
axios.interceptors.response.use((res) => {
  //对响应数据做些事
  if (!res.data.success) {
    return Promise.resolve(res);
  }
  return res;
}, (error) => {
  console.log('网络异常')
  return Promise.reject(error);
});

function post(url, params, config) {
  return new Promise((resolve, reject) => {
    axios.post(url, params)
      .then(response => {
        if (response.data.code === '4005') {
          window.localStorage.clear();
          location.reload()
        }
        resolve(response.data);
      }, err => {
        reject(err);
      })
      .catch((error) => {
        reject(error)
      })
  })
}

function get(url, param) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: param
    })
      .then(response => {
        resolve(response.data)
      }, err => {
        reject(err)
      })
      .catch((error) => {
        reject(error)
      })
  })
}

export default { post, get }

如果需要自定义添加请求头(例如 POST 请求)

解决方法:修改 POST 请求

// 修改后的 POST 请求
function post(url, params, config = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, params, config)
      .then(response => {
        if (response.data.code === '4005') {
          window.localStorage.clear();
          location.reload()
        }
        resolve(response.data);
      }, err => {
        reject(err);
      })
      .catch((error) => {
        reject(error)
      })
  })
}

注意:添加请求头时需要后台配合,否则请求会报错

package com.filter;

import com.enums.ColorEnum;
import com.utils.printColorUtil;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Order(1)  //设置优先级 
@WebFilter(filterName = "CoreFilter", value = {"/*"})
public class CoreFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        printColorUtil.println("跨域过滤器启动了", ColorEnum.BLUE.getCode(), ColorEnum.WHITE.getCode());
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        // 设置服务器会接收来自 任意域名的请求
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 设置允许携带cookie
        response.setHeader("Access-Control-Allow-Credentials", "true");
        // 设置允许访问的方法
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, GET");
        // 设置预检请求(options)可以保存的时间,即在这个时间内不再发起预检请求
        response.setHeader("Access-Control-Max-Age", "3600");
        // 设置服务器支持的所有头信息字段,这里的Authorization是自定义的
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
        // 设置允许前端发送的请求头
        response.setHeader("Access-Control-Request-Headers", "Authorization");
        // 暴露头信息(这句话非常重要,我就是加了这句话才好使的),在响应头夹带信息给前端也要加这句话才好使
        response.setHeader("Access-Control-Expose-Headers", "Authorization");
        if ("OPTIONS".equals(request.getMethod())) {
            // 进行我们定义的请求前,浏览器自动发起的options请求
            System.out.println("options");
            // 服务器正常接收,返回状态码,不响应其他内容
            response.setStatus(HttpStatus.ACCEPTED.value());
            return;
        } else {
            // 非options请求,放行
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用 `axios` 封装类时,可以在发送 `post` 请求时,为了防止参数被篡改,我们可以将参数序列化后再发送。可以使用 `querystring` 模块中的 `stringify()` 方法将参数序列化成字符串,然后在发送请求时将其作为请求体发送。 以下是一个示例代码,可以在 `axios` 封装类中判断请求方法是 `post` 时,将参数序列化后追加到请求体中: ```javascript import axios from 'axios'; import queryString from 'querystring'; const instance = axios.create({ baseURL: 'https://api.example.com' }); // 封装请求方法 class Http { static async post(url, data) { try { let config = { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; if (data && typeof data === 'object') { // 如果是对象,则序列化成字符串 data = queryString.stringify(data); // 追加到请求体中 config.data = data; } const response = await instance.post(url, data, config); return response.data; } catch (error) { throw error; } } } export default Http; ``` 在上面的代码中,我们先判断 `data` 参数是否是对象,如果是,则使用 `querystring.stringify()` 方法将其序列化成字符串,然后将其作为请求体发送。如果不是对象,则直接将其发送。 需要注意的是,为了让服务器正确解析请求体中的参数,我们在 `headers` 中设置了 `Content-Type` 为 `application/x-www-form-urlencoded`,这表示请求体中的参数是使用 `application/x-www-form-urlencoded` 格式进行编码的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值