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
相关产品推荐
相关产品推荐

