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

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

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

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

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

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

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

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


Tomcat 配置允许跨域

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述


CorsFilter
org.apache.catalina.filters.CorsFilter

cors.allowed.origins
*


cors.allowed.methods
GET,POST,HEAD,OPTIONS,PUT


cors.allowed.headers
*


cors.exposed.headers
Access-Control-Allow-Origin,Access-Control-Allow-Credentials


cors.support.credentials
true



CorsFilter
/*

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

在这里插入图片描述


Web 项目配置允许跨域

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

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

2. 配置允许跨域

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

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

corsMyCORSFilter

cors/*

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

import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class MyCORSFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic 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);}@Overridepublic 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 {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {System.out.println("自动配置生效addResourceHandlers");registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");super.addResourceHandlers(registry);}//前端跨域@Overridepublic 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);//跨域允许时间}//为了解决中文编码方式乱码问题@Beanpublic HttpMessageConverter responseBodyConverter() {StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));converter.setWriteAcceptCharset(false);return converter;}@Beanpublic ObjectMapper getObjectMapper() {return new ObjectMapper();}@Beanpublic MappingJackson2HttpMessageConverter messageConverter() {MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();converter.setObjectMapper(getObjectMapper());return converter;}@Overridepublic void configureMessageConverters(List> 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.rkmt.cn/news/86074.html

相关文章:

  • 剪贴板增强工具的高级应用:从效率工具到生产力系统的蜕变
  • 终极文件下载工具:CyberdropBunkrDownloader完整使用指南
  • 2025年五大靠谱的工业旅游参观通道设计公司推荐:看看哪家口 - mypinpai
  • GNU创始人斯托曼:ChatGPT是“胡扯生成器”
  • 告别环境配置噩梦:Docker-Android让移动开发如此简单
  • 2025年五大比较不错的算力中心散热器品牌企业推荐,正规制造 - 工业推荐榜
  • 2025年上海口碑好的股权变更品牌企业推荐:有实力的股权变更 - 工业品牌热点
  • Packmol实战指南:3步构建完美的分子动力学初始构型
  • 电视盒子系统改造:Armbian系统完整部署指南
  • HeyGem.ai内存优化实战:32G环境下的性能提升全方案
  • Wan2.2-T2V-A14B在天文现象模拟视频中的科学准确性验证
  • DG-Lab郊狼控制器终极指南:重新定义游戏互动惩罚系统
  • TlbbGmTool天龙八部GM工具完整使用指南:从零开始掌握游戏管理
  • gif-h:轻量级C++动态GIF生成库完整指南
  • Tabula完全指南:3步快速从PDF提取表格数据的终极解决方案
  • Phigros模拟器完整教程:打造个性化音乐游戏体验
  • 2025年别墅家用电梯制造商实力排行榜,专业测评精选推荐 - 工业品牌热点
  • 2025大模型效率革命:Qwen3-32B-MLX-4bit单模型双模式切换重塑AI应用范式
  • ModernWMS开源仓库管理系统:从入门到精通的全流程指南
  • Wan2.2-T2V-A14B模型的用户反馈闭环建设路径
  • 如何快速掌握MajesticAdmin:企业级后台系统的终极使用指南
  • JSON翻译神器:5分钟搞定多语言文件转换终极指南
  • 9 个 MBA 课堂汇报工具推荐,AI 降重免费网站合集
  • 终极指南:Font Awesome 7图标库全面解析与实战应用
  • MATLAB图像导出专业指南:从入门到精通的完整解决方案
  • 如何用容器化技术彻底解决开发环境配置难题?
  • Fluent Terminal:Windows命令行体验的终极解决方案
  • APK Icon Editor:快速掌握Android应用定制终极指南
  • 5步精通Wan2.2:零基础玩转AI视频创作
  • Wan2.2-T2V-A14B模型在海洋馆生物介绍视频中的生态还原