最近博主在写一个项目的时候,测试的时候发现前端的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();
}
}
}
}