部署在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路径,静态文件路径及写入权限设置正确。
求助问题
- 如何排查AJAX请求出现404错误的原因?
- 为何本地正常但部署到VM环境后出现问题?
- 在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系统用户运行,需确认Tomcat运行用户是否有上传目录的读写权限; - 线上环境的防火墙或安全策略可能拦截了请求,本地无此类限制。
- 本地Tomcat以当前用户运行,线上可能以
3. 检查请求未转发到控制器的方法
- 启用Spring MVC请求日志:
- 在日志配置文件(如
logback.xml)中添加DEBUG级别日志:
若日志中无<logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG"/>/uploadajaxAction.do的请求记录,说明请求未到达Spring层;若有记录但返回404,说明Spring未找到对应映射。
- 在日志配置文件(如
- 查看Tomcat访问日志:
- 检查Tomcat
logs目录下的access_log.*文件,若没有该请求记录,说明请求未到达Tomcat;若有记录,可查看返回码和请求详情。
- 检查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,提问作者김훈겸
相关产品推荐
相关产品推荐

