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

