当前位置: 首页 > 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.cnnetsun.cn/news/1247927.html

相关文章:

  • 如何在 Golang 项目中高效运用 Protocol Buffers
  • 深度解析嵌入式for循环实现原理!
  • 使用PDF-Extract-Kit-1.0实现科研论文元数据自动提取
  • DeEAR语音情感识别避坑手册:采样率不匹配、通道数错误、静音过长导致的失败
  • DeepSeek-OCR-2部署教程:WSL2环境下Windows用户零配置运行深求·墨鉴
  • Qwen3-TTS语音合成进阶教程:情感强度、语速、停顿符的控制方法
  • Gemma-3-270m与MySQL数据库集成实战:高效数据处理方案
  • Realistic Vision V5.1 创意作品展:结合SolidWorks模型渲染的工业设计概念图
  • Qwen3-Reranker-4B性能优化:vLLM推理加速实践指南
  • 云容笔谈·东方红颜影像生成系统性能调优:针对STM32嵌入式设备展示的优化策略
  • 音乐流派分类Web应用保姆级教程:ViT模型+Gradio快速上手指南
  • 3个步骤解决OpenMV IDE在Raspberry Pi Bookworm上的兼容性问题
  • Qwen2.5-VL-7B-Instruct惊艳效果:漫画分镜图→剧情连贯性描述+角色关系推断
  • 如何摆脱平台依赖?yuque-exporter让语雀知识库完全自主掌控
  • Qwen3-VL-2B API接口安全设置:认证与限流配置
  • Phi-4-reasoning-vision-15B入门必看:如何规避click(x,y)输出?强约束提示词模板库
  • 内存故障排查全景图:从症状到解决方案的深度指南
  • Phi-3-Mini-128K算力利用率提升:多并发请求下GPU利用率稳定达82%实测
  • MusePublic资源监控教程:nvidia-smi实时跟踪显存与GPU利用率
  • Z-Image-Turbo-辉夜巫女对比评测:不同采样器生成效果与速度分析
  • AIGlasses OS Pro 面试宝典:攻克计算机视觉与深度学习常见八股文
  • Realistic Vision V5.1 赋能Java开发者:集成指南与面试题实战解析
  • Buildozer实战全攻略:突破Python跨平台打包技术瓶颈
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4与Web开发集成实战
  • 使用SeqGPT-560m增强IDEA开发体验:智能代码审查插件
  • 消息留存保卫战:RevokeMsgPatcher防撤回补丁解决微信4.0.3.36版本适配难题
  • 衡山派Luban-Lite GPIO驱动架构详解:HAL与Driver层设计及RT-Thread Pin设备驱动集成
  • Cosmos-Reason1-7B部署教程:Ubuntu 22.04 LTS系统依赖库版本兼容性清单
  • mPLUG视觉问答:专注图片理解+英文提问,轻量级图文交互工具
  • Chatbot App 注册功能开发指南:从零搭建到生产环境部署