axios发送两次相同的请求,使用Springboot如何解决

最近博主在写一个项目的时候,测试的时候发现前端的axios向后端发送了两次请求,而且还不是网上大多数人遇到的一次option请求,一次get/post请求,而是两次完全相同的Get请求。解决方法在最后

如下图所示,两次一摸一样的get请求

 一:我的试错经历(不是解决方法。。。)

1.我也许和大家一样,用拦截器来拦截两次请求,但是依然会出现两次相同的get请求

@Component
@Slf4j
public class Interceptor implements HandlerInterceptor {



    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //origin:指定可以访问本项目的IP
        String origin = request.getHeader("Origin");
        response.setContentType("application/json;charset=UTF-8");
        response.setHeader("Access-Control-Allow-Origin", origin);
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "1800");
        //  设置  受支持请求标头(自定义  可以访问的请求头  例如:Token)
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,token,Origin,Content-Type,Accept");
        // 指示的请求的响应是否可以暴露于该页面。当true值返回时它可以被暴露
        response.setHeader("Access-Control-Allow-Credentials", "true");
        //如果是OPTIONS请求,让其响应一个 200状态码,说明可以正常访问
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return false;
        }
        return true;

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

}

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private Interceptor interceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //设置跨域得拦截器 ,/** 表示拦截所有请求
        registry.addInterceptor(interceptor).addPathPatterns("/**");
    }
}

2.在前端设置一个判断变量,用来判断发送的次数,但依然不行,而且甚至没有了这两个get请求

async mounted() {
    if (!this.requestSent) { // 检查是否已经发送过请求
        try {
            const response = await axios.get('http://localhost:9090/GetIp');
            // 处理响应数据
            this.handleResponse(response);
            // 将请求已发送标志设置为true
            this.requestSent = true;
        } catch (error) {
            console.error('Error fetching IP:', error);
        }
    }
},
data() {
    return {
        requestSent: false // 初始化标志变量
    };
},

神奇的是,这两个请求没了???这让我想到,这tm不是并发吧。。

3.解决方法,使用ReentrantLock锁来解决,注意,这只是解决后端处理问题,实际上还是会发送两次相同get请求,但是最后一次get请求并没有进入到接口方法中。。我也尽力了,只能这样做了。。。

mport java.util.concurrent.locks.ReentrantLock;

@RestController
public class ExampleController {

    private final ReentrantLock lock = new ReentrantLock(); //使用锁
    private boolean ResCount=false;

    @GetMapping("/GetIp")
    public String handleRequest() {
        lock.lock();
        if(!ResCount){
           ResCount=true;
           try {
            // 处理请求逻辑
            return "Response";
           } finally {
             lock.unlock();
           }

      }
     
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值