当前位置: 首页 > 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 {@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<String> 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<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)

相关文章:

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

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务&#xff08;Spring MVC Springboot&#xff09;同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题&#xff0c;因为已经处理…...

在C语言中使用伪终端与bash交互

了解伪终端概念&#xff1a; 伪终端&#xff08;PTY&#xff09;由一对设备组成&#xff1a;主设备&#xff08;master&#xff09;和从设备&#xff08;slave&#xff09;。数据写入主设备会出现在从设备&#xff0c;反之亦然。这允许一个进程通过主设备与另一个进程&#xff…...

阿里云 人工智能与机器学习

阿里云的 人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09; 服务为企业提供了全面的AI解决方案&#xff0c;帮助用户在多个行业实现数据智能化&#xff0c;提升决策效率&#xff0c;推动业务创新。阿里云通过先进的技术和丰富的工具&#xff0c;支持用…...

HTML 显示器纯色亮点检测工具

HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Html相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#…...

【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行

0x00 前言 最近在做渗透笔记&#xff0c;其中有一个靶机在getshell后&#xff0c;需要进行提权。发现靶机使用root启动的mysql服务&#xff0c;那么尝试使用UDF提权。于是在提权成功后&#xff0c;花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用&#xff0c;加深理解。…...

Mybatis(day09)

Mybatis基础操作 功能列表&#xff1a; 查询 根据主键ID查询 条件查询新增更新删除 根据主键ID删除 根据主键ID批量删除 准备 实施前的准备工作&#xff1a; 准备数据库表创建一个新的 springboot 工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql 驱动、…...

模式识别与机器学习 | 十一章 概率图模型基础

隐马尔科夫模型&#xff08;Hidden Markov Model,HMM&#xff09; HMM是建模序列数据的图模型 1、第一个状态节点对应一个初始状态概率分布 2、状态转移矩阵A, 3、发射矩阵概率B 4、对特定的&#xff08;x,y&#xff09;的联合概率可以表示为 α递归计算——前向算法β递归…...

深圳知识产权保护中心再发力,两大产业专利预审服务全新升级

在当今科技迅猛发展、市场竞争日益激烈的时代&#xff0c;知识产权保护对于产业发展的重要性不言而喻。深圳知识产权保护中心又有大动作&#xff0c;为高端装备制造和珠宝加工产业带来了专利预审服务的新突破。这一举措不仅为这两个产业注入了强大的发展动力&#xff0c;也为深…...

同步与并发:Java的同步舞蹈

现在&#xff0c;我们将深入探讨同步与并发&#xff0c;这是确保多线程程序正确性和效率的关键&#xff0c;就像是Java的同步舞蹈。 1 并发的概念 并发是指在多处理器系统中&#xff0c;多个操作或多个线程同时进行执行。在Java中&#xff0c;这意味着能够有效地利用多核处理…...

Kafka详解 ③ | Kafka集群操作与API操作

目录 1、Kafka集群操作 1.1、创建 topic 1.2、查看主题命令 1.3、生产者生产 1.4、消费者消费数据 1.5、运行 describe topics命令 1.6、增加 topic分区数 1.7、增加配置 1.8、删除配置 1.9、删除 topic 2、Kafka的Java API操作 2.1、生产者代码 2.2、消费者代 2…...

k8s基础(1)—Kubernetes-Pod

一、Pod简介 Pod是Kubernetes&#xff08;k8s&#xff09;系统中可以创建和管理的最小单元&#xff0c;是资源对象模型中由用户创建或部署的最小资源对象模型‌。Pod是由一个或多个容器组成的&#xff0c;这些容器共享存储和网络资源&#xff0c;可以看作是一个逻辑的主机‌。…...

iOS - 数组的真实类型

1. NSArray 类簇 // 1. __NSArray0 (空数组) NSArray *empty [];// 2. __NSArrayI (不可变数组) NSArray *immutable [1, 2, 3];// 3. __NSArrayM (可变数组) NSMutableArray *mutable [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组) NSArray *single …...

k8s启动报错

执行kubeadm init --image-repository registry.aliyuncs.com/google_containers 出现如下结果: [api-check] The API server is not healthy after 4m0.000885686s Unfortunately, an error has occurred: context deadline exceeded This error is likely caused by:…...

git:指令集

以下是对这些 Git 新特性和命令的更详细解读和实际用例分析&#xff0c;帮助更好地理解它们的作用及适用场景&#xff1a; 1. git switch 和 git restore 背景&#xff1a; 传统上&#xff0c;git checkout 是一个多功能命令&#xff0c;用于切换分支、检出文件、创建分支等&…...

自闭症家庭:建立支持系统与平衡生活

在自闭症家庭的世界里&#xff0c;每一天都充满了挑战与希望。自闭症&#xff0c;这一复杂的神经发育障碍&#xff0c;不仅影响着孩子的成长轨迹&#xff0c;也对整个家庭的生活方式产生了深远的影响。面对这一挑战&#xff0c;许多家庭都在努力寻找有效的支持系统和平衡生活的…...

html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)

htmlcssjs网页设计 美食 美食天下2个页面&#xff08;里面包含php和mysql&#xff09; 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…...

高阶知识库搭建实战七、(知识库雏形开发:qianwen-plus+Faiss)(练习推荐)

构建知识库:结合Faiss和qianwen-plus大模型的实践 环境搭建参考前面几篇文章:基础环境搭建、Faiss向量数据库安装 在当今信息爆炸的时代,如何高效地管理和检索海量知识成为了一个重要课题。知识库的构建为我们提供了一种有效的解决方案,它能够将分散的信息整合起来,方便…...

麒麟服务器安装kafka--亲测

我这安装的是单机版本的&#xff1a; 下载地址&#xff1a;Index of /kafka/3.9.0 我下载的是&#xff1a;https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…...

微机——8086微处理器的数据传送指令

目录 数据传送指令&#xff1a; 通用数据传送指令&#xff1a; MOV指令&#xff1a; 堆栈操作指令&#xff1a; PUSH指令&#xff1a; POP指令&#xff1a; 交换指令XCHG&#xff1a; XCHG指令&#xff1a; 换码指令XLAT&#xff1a; 换码指令XLAT&#xff1a; 8086 …...

vue3中onUpdated钩子函数和nextTick的具体使用场景和区别

在 Vue 3 中&#xff0c;onUpdated 钩子函数和 nextTick 方法都用于处理 DOM更新后的操作&#xff0c;但它们的使用场景和触发时机有所不同。以下是它们的具体使用场景和区别&#xff0c;结合代码示例进行解释&#xff1a; onUpdated 钩子函数 使用场景&#xff1a;适用于需要…...

.NET+AI | Agent Skills | File-based Agent Skills 帮你复用成千上万的开源技能

以下内容选自我精心打造的《.NETAI | 智能体开发进阶》课程&#xff0c;如需系统学习&#xff0c;不妨阅读原文了解详情。上一篇我们聊了 Inline Skill。它最大的优点是轻&#xff1a;写得快、调得快、验证也快&#xff0c;非常适合作为 Agent Skills 的第一站。但问题也很明显…...

STM32智能循迹小车(1)多路TCRT5000传感器与PWM调速融合实践

1. 多路TCRT5000传感器布局策略 在搭建STM32智能循迹小车时&#xff0c;传感器的布局直接影响循迹效果。我建议采用前三角布局法&#xff1a;将三个TCRT5000模块呈等腰三角形排列&#xff0c;中间传感器位于车头正中&#xff0c;左右两侧传感器对称分布&#xff0c;间距建议控制…...

2026八大数据采集与数据服务工具深度测评:分级分类全解析

在数据驱动的时代&#xff0c;选择合适的数据工具如同挑选趁手的工具。为了帮你快速定位&#xff0c;本文将八款主流产品按 “数据采集工具&#xff08;自助型&#xff09;”和“数据服务商&#xff08;成品/标注型&#xff09;” 两大类别&#xff0c;再依据用户能力、团队规模…...

【2026奇点大会独家解码】:AIAgent对话管理的5大认知拐点与企业落地避坑指南

第一章&#xff1a;【2026奇点大会独家解码】&#xff1a;AIAgent对话管理的5大认知拐点与企业落地避坑指南 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点大会上&#xff0c;来自DeepMind、阿里通义实验室与MIT CSAIL的联合白皮书首次系统揭示&#xff1a;当前83…...

按 Token 计费是个坑?企业级 Agent 的 FinOps 成本控制策略

按 Token 计费是个坑?企业级 Agent 的 FinOps 成本控制策略 关键词 Token 计费 企业级 Agent FinOps 成本控制 大语言模型(LLM) prompt 工程 资源优化 摘要 随着大语言模型(LLM)在企业中的广泛应用,Token计费模式已成为AI应用成本的主要组成部分。本文深入探讨了企业级Agen…...

AIMP(音乐播放软件)

AIMP是一款免费的音频播放器&#xff0c;支持多种音频格式&#xff0c;包括MP3、OGG、FLAC、WAV、AAC等。它具有简洁的界面和强大的功能&#xff0c;是一款非常受欢迎的音频播放器。 软件功能 1. 支持多种音频格式&#xff0c;包括MP3、OGG、FLAC、WAV、AAC等。 2. 支持自动歌…...

基于Tasmota固件的ESP8266与PZEM-004T智能电表系统搭建指南(二):数据可视化与安全优化

1. 数据可视化方案选型与搭建 在完成智能电表的基础数据采集后&#xff0c;如何让这些数据"活起来"是关键。我测试过多种方案后&#xff0c;最终选择了InfluxDBGrafana这对黄金组合。先说为什么不用Home Assistant自带的图表——它虽然简单易用&#xff0c;但当你需要…...

Go语言的sync.RWMutex表现真实

Go语言的sync.RWMutex表现真实 在并发编程中&#xff0c;锁机制是保证数据一致性的核心工具之一。Go语言的sync.RWMutex通过读写分离的设计&#xff0c;在高并发场景下表现出色&#xff0c;既提升了性能&#xff0c;又确保了线程安全。它的表现不仅体现在高效的锁竞争管理上&a…...

等保.三级要求下Redis 安全测评应该怎么做?粤

在之前的文章中&#xff0c;我们花了大量的篇幅&#xff0c;从记录后端pod真实ip开始说起&#xff0c;然后引入envoy&#xff0c;再解决了各种各样的需求&#xff1a;配置自动重载、流量劫持、sidecar自动注入&#xff0c;到envoy的各种能力&#xff1a;熔断、流控、分流、透明…...

RexUniNLU真实生成效果:医疗问诊记录中症状实体+情感倾向联合输出

RexUniNLU真实生成效果&#xff1a;医疗问诊记录中症状实体情感倾向联合输出 1. 引言&#xff1a;当AI能看懂病历和感受情绪 想象一下&#xff0c;一位医生每天要面对几十份电子病历和问诊记录。他需要快速找出病人的关键症状&#xff0c;同时还要判断病人描述病情时的情绪状…...