You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在GCP VM的Spring Legacy项目文件上传404错误排查求助

Spring Legacy文件上传功能部署GCP VM后AJAX请求404排查问题

我们正在开发一个Spring Legacy项目并实现文件上传功能。本地环境中,使用AJAX的文件上传请求运行正常,但部署到GCP VM环境后,浏览器控制台出现404错误,且Tomcat日志中无相关请求记录,项目部署在Tomcat的ROOT路径下。

Spring Controller代码

@PostMapping(value = "/uploadajaxAction.do")
@ResponseBody
public ResponseEntity<List<AttachFileVO>> uploadAjaxPost(MultipartFile[] uploadFile) {
    List<AttachFileVO> list = new ArrayList<>();
    String uploadfolderPath = getFolder();

    File uploadPath = new File(uploadFolder + "/" + uploadfolderPath);
    if (!uploadPath.exists()) {
        uploadPath.mkdirs();
    }

    for (MultipartFile multipartFile : uploadFile) {
        if (!multipartFile.isEmpty()) {
            String uploadFileName = multipartFile.getOriginalFilename();
            uploadFileName = uploadFileName.substring(uploadFileName.lastIndexOf(File.separator) + 1);

            UUID uuid = UUID.randomUUID();
            uploadFileName = uuid.toString() + "_" + uploadFileName;

            try {
                File saveFile = new File(uploadPath, uploadFileName);
                multipartFile.transferTo(saveFile);

                AttachFileVO attachVO = new AttachFileVO();
                attachVO.setUuid(uuid.toString());
                attachVO.setFileName(uploadFileName);
                attachVO.setUploadPath(uploadfolderPath);

                if (checkImageType(saveFile)) {
                    File thumbnailFile = new File(uploadPath, "s_" + uploadFileName);
                    Thumbnails.of(multipartFile.getInputStream())
                            .forceSize(300, 300)
                            .toFile(thumbnailFile);
                    attachVO.setImage(true);
                }

                list.add(attachVO);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return new ResponseEntity<>(list, HttpStatus.OK);
}

AJAX代码

$("input[type='file']").change(function (e) {
    var formData = new FormData();
    var inputFile = $("input[name='uploadFile']");
    var files = inputFile[0].files;

    for (var i = 0; i < files.length; i++) {
        if (!checkExtension(files[i].name, files[i].size)) {
            return false;
        }
        formData.append("uploadFile", files[i]);
    }

    $.ajax({
        url: '/uploadajaxAction.do',
        processData: false,
        contentType: false,
        data: formData,
        type: "POST",
        dataType: 'json',
        success: function (result) {
            console.log(result);
            showUploadResult(result);
        }
    });
});

function checkExtension(fileName, fileSize) {
    var allowedExtensions = /\.(jpg|jpeg|png|gif)$/i;
    var maxSize = 5242880; // 5MB

    if (fileSize >= maxSize) {
        alert("5MB 이하 사이즈의 이미지를 올려주세요.");
        return false;
    }
    if (!allowedExtensions.test(fileName)) {
        alert("이미지 파일(png, jpg, jpeg, gif)만 업로드할 수 있습니다.");
        return false;
    }
    return true;
}

HTML代码

<div class="row">
    <div class="col-12">
        <label for="datec" class="form-label">대표 이미지</label>
        <div class="uploadDiv">
            <input class="form-control" type="file" id="formFile" name="uploadFile">
        </div>
        <div class="uploadResult mt-3">
            <ul></ul>
        </div>
    </div>
</div>

已尝试的操作

  • 通过浏览器开发者工具查看AJAX请求:请求URL为http://vm-address/uploadajaxAction.do,响应状态为404 Not Found;
  • 检查Tomcat日志:catalina.out中无相关请求日志,推测Tomcat未收到请求;
  • 检查VM环境:项目部署在Tomcat的ROOT路径,静态文件路径及写入权限设置正确。

求助问题

  1. 如何排查AJAX请求出现404错误的原因?
  2. 为何本地正常但部署到VM环境后出现问题?
  3. 在Spring Legacy + Tomcat环境中,如何检查/uploadajaxAction.do这类请求未转发到控制器的可能性?

问题排查与解决方案

1. AJAX请求404错误排查步骤

  • 确认请求路径与网络可达性:
    • 检查GCP VM安全组规则,确认Tomcat使用的端口(如8080)是否开放入站请求;
    • 在浏览器Network标签中,核对请求的完整URL、请求头(Host、Content-Type)是否正确,请求体是否正常发送;
    • 直接在VM内部用curl命令测试请求:curl -X POST http://localhost:8080/uploadajaxAction.do,看是否能收到响应,排除外部网络问题。
  • 检查中间层拦截逻辑:
    • 若VM前有反向代理(如Nginx),确认代理配置是否正确转发请求到Tomcat,是否有URL重写规则修改了请求路径;
    • 检查项目中的过滤器(Filter),比如权限验证、跨域拦截类,是否在生产环境中拦截了该请求。

2. 本地正常、线上异常的常见原因

  • 环境配置差异:
    • 对比本地与线上Tomcat的context.xml、web.xml配置,比如线上是否启用了RemoteIpValve导致路径解析异常,或Multipart文件大小限制配置不同,导致请求被提前拦截;
    • 检查Spring配置文件(applicationContext.xml、dispatcher-servlet.xml),确认Controller类的扫描路径是否正确,线上可能因配置遗漏未扫描到目标Controller。
  • 权限与运行身份差异:
    • 本地Tomcat以当前用户运行,线上可能以tomcat系统用户运行,需确认Tomcat运行用户是否有上传目录的读写权限;
    • 线上环境的防火墙或安全策略可能拦截了请求,本地无此类限制。

3. 检查请求未转发到控制器的方法

  • 启用Spring MVC请求日志:
    • 在日志配置文件(如logback.xml)中添加DEBUG级别日志:
      <logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG"/>
      
      若日志中无/uploadajaxAction.do的请求记录,说明请求未到达Spring层;若有记录但返回404,说明Spring未找到对应映射。
  • 查看Tomcat访问日志:
    • 检查Tomcatlogs目录下的access_log.*文件,若没有该请求记录,说明请求未到达Tomcat;若有记录,可查看返回码和请求详情。
  • 验证Controller映射注册:
    • 查看项目启动日志,确认是否有Mapped "{[/uploadajaxAction.do],methods=[POST]}"这类日志,说明Controller方法已被正确注册;
    • 在Controller方法开头添加日志输出(如System.out.println("接收上传请求");),线上测试后查看Tomcat控制台,若无输出则请求未到达该方法。
  • 核对DispatcherServlet映射:
    • 检查web.xml中DispatcherServlet的映射配置,确认是否包含*.do规则:
      <servlet-mapping>
          <servlet-name>dispatcher</servlet-name>
          <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      
      若映射路径错误,/uploadajaxAction.do不会被转发到Spring处理。

内容的提问来源于stack exchange,提问作者김훈겸

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:39:56