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

Java Servlet设置CORS响应头仍报错,预检请求未通过控制检查

解决Java Servlet POST请求的CORS预请求错误

你的问题核心在于浏览器发送的OPTIONS预请求没有被Servlet正确处理。当前端发起跨域的非简单请求(比如带自定义头的POST)时,浏览器会先发送一个OPTIONS请求验证服务器是否允许跨域操作,但你的当前代码只覆盖了GET和POST方法,未处理OPTIONS请求,导致预请求响应缺失Access-Control-Allow-Origin等关键头,最终触发CORS拦截。

下面是修复后的完整Servlet代码,重点添加了doOptions方法专门处理预请求:

@WebServlet(asyncSupported = true, urlPatterns = {"/Mitarbeiter_Einzel_Update"})
public class Mitarbeiter_Einzel_Update extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Mitarbeiter_Einzel_Update() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理OPTIONS预请求,设置必要的CORS头
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
        response.setHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
        response.setHeader("Access-Control-Max-Age", "1728000");
        // 预请求无需返回实体内容,设置200状态码即可
        response.setStatus(HttpServletResponse.SC_OK);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        // POST请求也需设置CORS头(可提取为公共方法减少重复代码)
        response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080");
        response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
        response.addHeader("Access-Control-Max-Age", "1728000");
        response.addHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
        
        // 你的POST业务逻辑代码继续写在这里
        [...]
    }
}

额外注意事项:

  • 开发环境若需允许所有来源,可将Access-Control-Allow-Origin设为*,但生产环境建议指定具体域名,避免安全风险。
  • 可以把设置CORS头的逻辑提取为公共方法(比如setCorsHeaders(HttpServletResponse response)),在doOptions和doPost中统一调用,减少代码冗余。
  • 确认你的Servlet容器(如Tomcat)没有额外的CORS拦截配置,避免与代码中的设置冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:53:08