通过 Chrome 和 Edge 浏览器的 Spring Boot 代理控制器的 Ajax Post 请求的请求正文间歇性地丢失

Request body of Ajax Post request is intermittently missing for spring boot proxy controller via Chrome and Edge browser

提问人:Vishwas Upadhyay 提问时间:2/11/2022 更新时间:1/4/2023 访问量:359

问:

我在 Chrome 和 Edge 中使用我的 Web 应用程序时遇到了奇怪的间歇性问题,同时在单击按钮时发出简单的 ajax 发布请求。Ajax 请求落在我的应用程序的 Spring Boot 代理控制器上,该控制器进一步使用 RestTemplate 将请求发送到第三方服务器。我在 mozila 浏览器上测试了几次,甚至没有遇到过一次问题。因此,我假设这个奇怪的问题与浏览器有关,而不是与代码库有关。有没有人经历过同样的经历?

迄今为止的调查结果:在调试时,我发现我的代理控制器正在接收空白请求正文,并且第三方服务器正在发送错误,这是预期的,因为请求正文未传递。但是,在 chrome 浏览器开发工具中检查我的 ajax 调用时,我可以看到请求有效负载具有请求正文。但是当我检查控制器中的请求正文参数时,它显示为空白。那么,为什么请求正文在浏览器和控制器之间间歇性地被遗漏呢?

Ajax 请求:

 $.ajax({
            type: 'POST',
            url: webApiPath + '/search',
            contentType: 'application/json',
            beforeSend: authentication.beforeSend,
            dataType: 'json',
            data: JSON.stringify(requestObj),
        })

我的springboot代理控制器:

@RequestMapping("/**")
public @ResponseBody JsonResponse proxy(
    @RequestBody(required = false) String body,
    HttpMethod method, HttpServletRequest request) 
    throws URISyntaxException 
{
    
  // Do further stuff if body is not blank
   RestTemplate template = new RestTemplate();
   ResponseEntity<Object> original = template.exchange(
            url, method, httpEntity, Object.class);
        
   response.setSuccess(original.getBody());
   
 }

Spring Boot 版本:发布 2.2.5

jQuery版本:v3.2.1

Java 版本 : 1.8

Chrome 版本:版本 98.0.4758.82(官方版本)(64 位)

jQuery ajax spring-boot google-chrome microsoft-edge

评论

0赞 Xudong Peng 2/14/2022
看来这些有问题的浏览器都是基于chromium的,你可以尝试通过这个链接报告问题:bugs.chromium.org/p/chromium/issues/list
0赞 Leander Hass 12/30/2022
我在 Firefox 109 中遇到了类似的问题,我在表单提交时发送了 ajax 请求,同时阻止了默认的 post 请求。我尝试手动发送请求,一切正常,但是一旦它在 eventListener 中,它就没有发送任何正文。

答:

0赞 Vishwas Upadhyay 1/4/2023 #1

Spring boot 2.2.5 发布版附带的 tomcat 版本是 9.0.31。它已更新到 9.0.33 以解决我的问题。