如何解决使用Angular、Java Servlet的POST请求头错误?
Angular + Java Servlet POST请求头错误解决指南
1. 处理CORS预检请求(OPTIONS)
浏览器跨域发送POST(尤其是带自定义头/JSON格式)时会先发OPTIONS预检请求,Servlet必须正确响应:
@Override protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 替换成你的前端域名,生产环境请勿使用* resp.setHeader("Access-Control-Allow-Origin", "http://localhost:4200"); resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); // 这里要包含前端实际发送的所有请求头,比如Content-Type、自定义的X-开头的头 resp.setHeader("Access-Control-Allow-Headers", "Content-Type, X-Requested-With, Authorization"); resp.setHeader("Access-Control-Allow-Credentials", "true"); resp.setHeader("Access-Control-Max-Age", "3600"); resp.setStatus(HttpServletResponse.SC_OK); }
2. 对齐前后端Content-Type
- 若前端发送JSON(Angular HttpClient默认行为),Servlet不能用
request.getParameter()读取参数,需直接读取请求体:
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 先添加跨域响应头 resp.setHeader("Access-Control-Allow-Origin", "http://localhost:4200"); resp.setHeader("Access-Control-Allow-Credentials", "true"); // 读取JSON格式的请求体 BufferedReader reader = req.getReader(); String jsonBody = reader.lines().collect(Collectors.joining()); // 用Jackson/Gson等工具解析JSON,示例: // YourDto dto = new ObjectMapper().readValue(jsonBody, YourDto.class); }
- 若后端期望
application/x-www-form-urlencoded格式参数,前端需用HttpParams传参:
const params = new HttpParams() .set('username', 'test') .set('password', '123'); this.http.post('/api/login', params);
3. 检查请求头白名单
打开浏览器F12→网络面板,查看POST请求的Request Headers,把所有自定义头(比如X-Token)添加到Servlet的Access-Control-Allow-Headers配置中,漏加会直接触发请求头错误。
4. 确保CORS过滤器优先级
如果项目中有多个过滤器,需将CORS相关过滤器设置为第一个执行,避免其他过滤器提前拦截OPTIONS请求并返回错误。
内容的提问来源于stack exchange,提问作者igranted
相关产品推荐
相关产品推荐

