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

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内容复制到新文件后重新上传,验证是否是内容特征导致拦截。
  • 验证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能成功,再排查前端代码的差异。

内容的提问来源于stack exchange,提问作者Anjali Tejasvi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:00:59