当前位置: 首页 > news >正文

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
    • Tomcat 配置允许跨域
    • Web 项目配置允许跨域
    • Tomcat 同时允许静态文件和 Web 服务跨域

偶尔遇到一个 Tomcat 部署项目跨域问题,因为已经处理过太多跨域了,觉得很简单 。

结果尝试多次均不能达到想要的结果,又经过 Nginx、Tomcat 以及项目配置才完全搞定。

另外,之前总结了篇 Web 项目跨域问题(Geoserver),也可以综合参考。

本文包含 Tomcat 配置允许跨域、Web 项目配置允许跨域以及同时允许跨域三部分。


Tomcat 配置允许跨域

使用 Tomcat 作为静态文件服务还是比较简单和常用的,而跨域问题也比较容易解决。

Tomcat 静态文件允许跨域,设置比较简单,百度一搜一堆,这里简单贴一下。

1.Tomcat web.xml 配置允许所有跨域

设置之后,所有静态文件以及服务均被允许跨域。

(1) 当未配置允许跨域时,报跨域错误

浏览器直接访问是正常的:

(2)Tomcat conf/web.xml 文件配置允许跨域

<filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <init-param> <param-name>cors.allowed.origins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</param-name> <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> </init-param> <init-param> <param-name>cors.support.credentials</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

配置之后,重启 Tomcat,再次访问则正常:


Web 项目配置允许跨域

Web 项目,这里指的是java项目,打包的时候基本是选择war包或者jar包。

老项目以 war 包居多,新项目(Springboot)以 jar 包居多。

war 可以直接在 Tomcat 中部署启动,而 jar 包则往往通过命令启动。

因此,war 的跨域相关配置会收到 Tomcat 跨域配置影响。jar 包独立启动,不会受 Tomcat 影响。

这里介绍一下 Web 项目各种允许跨域配置。

1. 未配置允许跨域时,报跨域错误

而浏览器地址栏直接可以正常访问:

2. 配置允许跨域

(1)自定义过滤器允许跨域

WEB-INF/web.xml 配置文件允许所有接口跨域,一般不建议这样配置。

<filter> <filter-name>cors</filter-name> <filter-class>MyCORSFilter</filter-class> </filter> <filter-mapping> <filter-name>cors</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

过滤类,任意目录即可,以根目录为例,其他目录需要加上包路径:

import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class MyCORSFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, IOException { HttpServletResponse response = (HttpServletResponse) servletResponse; String origin = (String) servletRequest.getRemoteHost()+":"+servletRequest.getRemotePort(); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization"); response.setHeader("Access-Control-Allow-Credentials","true"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }

(2)继承 WebMvcConfigurationSupport 允许跨域

Springboot 框架下的配置,允许所有接口跨域,Springboot 环境下测试生效,Spring MVC环境下测试未生效。

package com.mapsharp.map.web.config; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import java.nio.charset.Charset; import java.util.List; /** * @author * @Description: 设置允许跨域访问static资源 * @date 2019/6/39:26 */ @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { System.out.println("自动配置生效addResourceHandlers"); registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); super.addResourceHandlers(registry); } //前端跨域 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**")//设置允许跨域的路径 .allowedOrigins("*")//设置允许跨域请求的域名 .allowedHeaders("*")//是否允许证书 不再默认开启 .exposedHeaders("Access-Control-Allow-Origin,Access-Control-Allow-Credentials")//是否允许证书 不再默认开启 .allowCredentials(true)//是否允许证书 不再默认开启 .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE")//设置允许的方法 .maxAge(3600);//跨域允许时间 } //为了解决中文编码方式乱码问题 @Bean public HttpMessageConverter<String> responseBodyConverter() { StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8")); converter.setWriteAcceptCharset(false); return converter; } @Bean public ObjectMapper getObjectMapper() { return new ObjectMapper(); } @Bean public MappingJackson2HttpMessageConverter messageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(getObjectMapper()); return converter; } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(responseBodyConverter()); converters.add(messageConverter()); } }

(3)@CrossOrigin 注解允许跨域

注意 Spring 框架版本,测试项目 Spring MVC 和 SpringBoot 均生效。

根据实际需求,选择在 类或者方法 剩添加 @CrossOrigin 注解即可。

这样的好处是,最小颗粒度控制允许跨域。


Tomcat 同时允许静态文件和 Web 服务跨域

Tomcat 静态文件和 Web 服务同时允许跨域,即 Tomcat webapp 目录下同时存在静态文件服务和 war 包启动的服务。

开始阶段发现,配置 Web 服务允许跨域之后不生效。但是静态文件可以正常访问。

后来经过测试,要想静态文件和 Web 服务接口都允许跨域,需要以下条件:

1.Tomcat 设置允许所有跨域,开放最大权限

注意下图中红框部分,笔者当时没注意,导致一直没解决问题。

注意:红框部分需要注释掉!

2.Web 服务不设置任何允许跨域配置(@CrossOrigin注解不影响)

Tomcat 中的 Web 服务,即 war 包中,不能设置允许跨域配置。

但是经过测试 @CrossOrigin注解 可以设置,不影响跨域结果。


文章小结:如果 Tomcat 和 Web 服务都配置了 web.xml 允许跨域,则会出现冲突,不能解决跨域问题。

如果只是 Web 项目,则在接口层面进行控制;

如果也需要静态文件和 Web 服务同时允许跨域,则在Tomcat 中进行一次配置即可。

同时配置允许跨域不生效的原因:个人感觉是因为有啥冲突,AI 的回答是:



参考博客:

tomcat 设置允许跨域访问

Tomcat解决跨域问题(Access-Control-Allow-Origin,403,404)

http://www.jsqmd.com/news/469897/

相关文章:

  • 2026模块化移动售楼处优质服务商推荐榜:临时售楼处、临时样板间、创意集装箱售楼处、可定制的售楼处、可拆卸售楼处选择指南 - 优质品牌商家
  • 2026年初至今,吉林地区值得信赖的路边石供应商精选 - 2026年企业推荐榜
  • 工业运动控制可靠伦茨伺服品牌推荐指南:科尔摩根电机、科尔摩根直线电机、科尔摩根维修、科尔摩根驱动器、伦茨PLC选择指南 - 优质品牌商家
  • 第二章 Spring中的Bean
  • 聚焦3c电子精密抓取需求,精选2026年高可靠3c电子电爪品牌 - 品牌2026
  • 机器人灵巧手技术与应用场景:助力挑选专业灵巧手品牌 - 品牌2026
  • 为什么RTL总是姗姗来迟?
  • 2026年个性化定制防盗盖供应商推荐指南:试管瓶、进样瓶、避光瓶、酒瓶盖、铝塑盖、铝盖、食品级玻璃瓶、儿童安全盖选择指南 - 优质品牌商家
  • 解决JDK25,IDEA控制台中文乱码问题
  • 如何在 Golang 项目中高效运用 Protocol Buffers
  • 2026可靠直流充电桩优质产品推荐榜:电动汽车充电桩、重卡充电桩、高功率充电桩、3C国标充电桩、V2G充电桩、快充充电桩选择指南 - 优质品牌商家
  • 2026年出国劳务优质服务推荐榜正规资质权益保障:出国劳务哪里工资高、劳务输出公司出国务工、劳务输出出国务工、正规出国务工机构选择指南 - 优质品牌商家
  • 2026政企办公优质会议电子门牌推荐榜:人员去向电子牌、塑胶电子门牌、学校兑换柜、学生积分兑换柜、安全积分兑换柜选择指南 - 优质品牌商家
  • NGA-BBS-Script:论坛界面优化与浏览效率提升工具——如何通过轻量级配置实现信息获取效率翻倍?
  • 电爪核心技术与选型要点——助力高效优质电爪品牌推荐 - 品牌2026
  • 全面了解电爪厂商实力与产品特点,精准对接靠谱电爪生产厂家 - 品牌2026
  • FireRedASR-AED-L在VMware虚拟机中的部署与测试
  • 2026年音圈线性执行器品牌推荐,详解原理与优势 - 品牌2026
  • GoldHEN_Cheat_Manager:重新定义PS4游戏体验的终极优化工具
  • 《认知几何学丛书》(附录:前言·后记·索引)
  • 2026皖江双T混凝土板优质品牌推荐榜:双t预制板、屋面双t板、混凝土马鞍板、钢筋混凝土双t板、预应力混凝土双t板选择指南 - 优质品牌商家
  • 2026兰州防火涂料优质推荐榜环保低VOC之选:兰州防火涂料、丙烯酸脂肪族聚氨酯面漆、丙烯酸防锈漆、室内超薄型钢结构防火涂料选择指南 - 优质品牌商家
  • 《认知几何丛书》第七卷:认知宇宙学与元理论
  • Janus-Pro-7B效果惊艳展示:冷色调丛林宇航员+红酒杯反射细节特写
  • 国内优质手提纸袋设备品牌推荐榜单:圆绳内折纸袋机、尖底纸袋机、扁绳内折纸袋机、方底纸袋机、方底纸袋设备、纸袋机器选择指南 - 优质品牌商家
  • Chord效果展示:同一视频下‘普通描述’vs‘视觉定位’双模式输出对比图
  • 2026年质量好的开模注塑加工厂家推荐:塑胶模具注塑加工厂家选择指南 - 品牌宣传支持者
  • 2026年灵巧手如何选对供应商?电爪品牌推荐,满足半导体设备需求 - 品牌2026
  • Nunchaku FLUX.1-dev部署教程:ComfyUI-nunchaku插件安装+工作流加载详解
  • 2026年温州安卓云手机厂商选择指南与五强解析 - 2026年企业推荐榜