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

Tomcat 9中XMLHttpRequest被CORS策略拦截的解决咨询

解决Tomcat下CORS预检请求失败的问题

针对你遇到的「预检请求响应缺少Access-Control-Allow-Origin头」问题,以下是几个可行的排查和解决方向:

1. 确认Tomcat CorsFilter的兼容性与加载顺序

  • 若使用Tomcat 6或更早版本,org.apache.catalina.filters.CorsFilter并不存在,需升级Tomcat到7+,或改用自定义CORS过滤器。
  • 检查web.xml中过滤器顺序:确保CorsFilter的<filter-mapping>放在所有其他过滤器之前。如果有安全拦截器、权限过滤器等先处理请求并返回响应,CorsFilter将无法添加必要的响应头。

2. 替换为自定义CORS过滤器

Tomcat自带的CorsFilter有时对复杂预检请求处理不够灵活,你可以手动实现一个简单过滤器直接处理OPTIONS请求:

自定义过滤器代码

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class SimpleCorsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        // 允许指定源访问
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:1180");
        // 允许的请求方法
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,HEAD,OPTIONS,PUT,DELETE");
        // 允许的请求头
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers");
        // 预检缓存时长
        response.setHeader("Access-Control-Max-Age", "180");

        // 直接响应OPTIONS预检请求
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {}
}

在web.xml中配置该过滤器(放在最顶部)

<filter>
    <filter-name>SimpleCorsFilter</filter-name>
    <filter-class>你的包路径.SimpleCorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SimpleCorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. 排查请求是否真正到达Tomcat

打开浏览器开发者工具(F12),查看网络标签中的OPTIONS预检请求:

  • 若响应状态码为404:确认请求URL路径/my/app是否在Tomcat中正确部署,上下文路径是否匹配。
  • 若响应状态码为403:检查Tomcat权限配置(如web.xml中的security-constraint)是否拦截了OPTIONS请求。
  • 若响应状态码为500:查看Tomcat日志,确认是否存在过滤器初始化或执行错误。

4. 处理HTTPS相关配置问题

目标地址为HTTPS,需确认:

  • Tomcat的HTTPS连接器配置正确,证书有效且未过期。
  • 无SSL相关拦截规则阻止OPTIONS请求。

5. 清除浏览器缓存或使用隐身模式测试

浏览器会缓存CORS预检响应,可能导致新配置无法生效。尝试用隐身窗口发起请求,或清除浏览器缓存后重试。

6. 检查反向代理(如果存在)

若Tomcat前端有Nginx、Apache等反向代理,代理服务器可能覆盖或删除CORS响应头。需在代理服务器中配置CORS规则:

  • 以Nginx为例,在对应location块中添加:
    add_header Access-Control-Allow-Origin http://localhost:1180;
    add_header Access-Control-Allow-Methods 'GET,POST,HEAD,OPTIONS,PUT,DELETE';
    add_header Access-Control-Allow-Headers 'Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers';
    
    if ($request_method = OPTIONS) {
        return 204;
    }
    

内容的提问来源于stack exchange,提问作者Tobias G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:23:18