Spring Boot应用AJAX上传PDF出现403 Forbidden错误排查
Spring Boot AJAX上传PDF触发403 Forbidden异常排查
问题背景
在Spring Boot应用中通过AJAX上传PDF时,大部分文件可正常上传,但有1-2个特定PDF会触发POST https://develop.abc.in/parseResume 403 (Forbidden)错误。这些PDF外观无异常,无法定位根因,相关AJAX代码片段如下:
// ajax call for Individual add candidate resume / function submitIndividualSharedFileInviteCandidate() { var data = new FormData(); var files = $('#individual')[0].files data.append('file',files[0]); if (!validateIndividualResumeUpload()) { return false; }else{ if(dummyData == "DummyData"){ currentactivity_dummyData = "btn_shareEmployee_uploadIndResume"; deleteDummyData(); removeDummyData="removeDummyData"; } } // var data = new FormData(formdata); var csrf = $("input[name='_csrf']").attr("value") $.ajax({ headers : { "X-CSRF-TOKEN" : csrf }, enctype : 'multipart/form-data', processData : false, // Important! contentType : false, cache : false, //this is my servlet crossDomain: true, // Set this option data : data, type : "POST", url : "./parseResume", success : function(result) { if (result.status == "Done") { current_employee_id = result.data.employeeId; $('#myModal').modal('hide'); // $('#candidatesBlock1').empty(); } $(".tab-slider--navresumedetails li:nth-child(2)").trigger('click') $(".tab-slider--navresumedetails li:nth-child(1)").css('pointer-events', 'none'); // $(".add_candidate_form_parent").css('height', '698px'); $(".add_candidate_form_parent").css('overflow', 'auto'); getSupplierEmail() var obj = result.data; unparsed_resumes_list = obj; current_employee_id = obj.employeeId; $('#userId_unparesedResume').val(obj.employeeId); unparsedBulkSharedResumePreview(obj); $('#btn_save_unparsedSharedBulkResumes').html('Save'); if (result.status == "error") { $('#myModal').modal('hide'); } }, error : function(result) { console.log(result); } }); }
排查思路与解决建议
- 检查PDF文件本身
- 确认这几个PDF的文件大小,是否超出Spring Boot配置的文件上传限制(
spring.servlet.multipart.max-file-size和spring.servlet.multipart.max-request-size),超出限制可能触发安全拦截返回403。 - 检查PDF的元数据、内嵌内容,部分安全组件(如Spring Security、WAF)会拦截包含可疑脚本、异常元数据的文件。可以尝试将PDF内容复制到新文件后重新上传,验证是否是内容特征导致拦截。
- 确认这几个PDF的文件大小,是否超出Spring Boot配置的文件上传限制(
- 验证CSRF令牌有效性
- 虽然代码中已携带
X-CSRF-TOKEN,但需在浏览器开发者工具的Network面板查看失败请求的请求头,确认令牌值是否与页面中_csrf输入框内容一致,排查是否存在令牌过期或传递错误的情况。
- 虽然代码中已携带
- 排查后端安全规则
- 检查Spring Security配置,是否有针对文件类型、请求内容的特殊拦截规则,比如部分PDF的MIME类型被识别异常,导致被判定为可疑文件拦截。
- 查看服务器WAF日志,确认是否是WAF针对这几个PDF的特征(如文件签名、内容关键词)触发了拦截规则。
- 查看服务器端日志
- 检查Spring Boot应用的日志,尤其是Spring Security相关日志,找到403错误的具体触发原因(如权限不足、CSRF验证失败、文件拦截等),日志会提供更精准的错误信息。
- 简化场景测试
- 用Postman等工具直接上传这几个PDF到
/parseResume接口,排除前端AJAX代码的影响。如果Postman也返回403,说明问题出在后端或安全配置;如果Postman能成功,再排查前端代码的差异。
- 用Postman等工具直接上传这几个PDF到
内容的提问来源于stack exchange,提问作者Anjali Tejasvi
相关产品推荐
相关产品推荐

