vue中axios发送OPTIONS预检请求的原因及如何通过

原因解析可参考链接
在这里插入图片描述
比对一下两次请求的头信息
在这里插入图片描述
在这里插入图片描述
前台触发请求的代码如下:
在这里插入图片描述
后端处理预检测的代码如下:
在这里插入图片描述
源代码如下:

public class TokenInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private TokenService tokenService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

        // 获取方法上的注解
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("P3P", "CP=CAO PSA OUR");
        if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
            response.addHeader("Access-Control-Allow-Methods", "POST,GET,TRACE,OPTIONS");
            response.addHeader("Access-Control-Allow-Headers", "Content-Type,Origin,Accept");
            response.addHeader("Access-Control-Max-Age", "120");
        }

        if(!(handler instanceof HandlerMethod)){
            System.out.println("预检测");
            return false;
        }

这样可以回应预检测,可以查看前端请求头的返回信息:
在这里插入图片描述
在这里插入图片描述
如果在vue中进行如下设置,将不会触发预检测。
在这里插入图片描述
调用方法的代码如下,以下为异步请求

import axios from 'axios'
import common from "./getToken";
import javaRsp from "./javaRsp";
import setLocal from "./setLocal";

let api = axios.create({
  timeout: 500000,
  baseURL:'/file'
})

api.interceptors.response.use(response => {
  return response;
}, (error) => {
  return error.response;
})

api.doPost = async (url, params) => {
  let location = await api.post(url, params, {
    headers: {
      'Content-Type': 'application/json'
    }
  });
  return location;
}

export default {
  async login(params) {
    let url = "/token/getTicket";
    let str = JSON.stringify(params);
    let tokenData;
    console.log(str)
    let response = await api.doPost(url, str);
    console.log(response)
    if (response.status == 200 && response.data.code == 200) {
      //存储本例localstorage
      setLocal.setLocal("ticket",response.data.data);
      tokenData = await common.getToken(response.data.data);
    }else if(response.status != 200){
      tokenData=javaRsp.javaErrorRsp(response.status,"网络异常!");
    }else{
      tokenData=response.data;
    }
    return tokenData;
  }
}

实际在项目开发中经常会遇见前端多次请求的问题,我也找过前端要他们处理一下,但是都说没办法处理,前端使用的是脚手架,即使前端有做接口防抖处理,但是作为后端还是应当使用一些技术来防治接口幂等的问题,建议在重要的操作做一下验证,比如使用唯一令牌的方式来确保每一次操作只能操作一次。详情见链接。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值