发布时间:2025-06-24 18:46:07 作者:北方职教升学中心 阅读量:185
1. 未配置允许跨域时,报跨域错误
而浏览器地址栏直接可以正常访问:
2. 配置允许跨域
(1)自定义过滤器允许跨域
WEB-INF/web.xml 配置文件允许所有接口跨域,一般不建议这样配置。
文章小结:如果 Tomcat 和 Web 服务都配置了 web.xml 允许跨域,则会出现冲突,不能解决跨域问题。jar 包独立启动,不会受 Tomcat 影响。Tomcat 以及项目配置才完全搞定。
注意:红框部分需要注释掉!
2.Web 服务不设置任何允许跨域配置(@CrossOrigin注解不影响)
Tomcat 中的 Web 服务,即 war 包中,不能设置允许跨域配置。Web 项目配置允许跨域以及同时允许跨域三部分。
这样的好处是,最小颗粒度控制允许跨域。 偶尔遇到一个 Tomcat 部署项目跨域问题,因为已经处理过太多跨域了,觉得很简单 。 Tomcat 静态文件允许跨域,设置比较简单,百度一搜一堆,这里简单贴一下。 使用 Tomcat 作为静态文件服务还是比较简单和常用的,而跨域问题也比较容易解决。 1.Tomcat web.xml 配置允许所有跨域 设置之后,所有静态文件以及服务均被允许跨域。 但是经过测试 @CrossOrigin注解 可以设置,不影响跨域结果。 过滤类,任意目录即可,以根目录为例,其他目录需要加上包路径: (2)继承 WebMvcConfigurationSupport 允许跨域 Springboot 框架下的配置,允许所有接口跨域,Springboot 环境下测试生效,Spring MVC环境下测试未生效。 Tomcat 静态文件和 Web 服务同时允许跨域,即 Tomcat webapp 目录下同时存在静态文件服务和 war 包启动的服务。 如果只是 Web 项目,则在接口层面进行控制; 如果也需要静态文件和 Web 服务同时允许跨域,则在Tomcat 中进行一次配置即可。 因此,war 的跨域相关配置会收到 Tomcat 跨域配置影响。 (3)@CrossOrigin 注解允许跨域 注意 Spring 框架版本,测试项目 Spring MVC 和 SpringBoot 均生效。 另外,之前总结了篇 Web 项目跨域问题(Geoserver),也可以综合参考。 根据实际需求,选择在 类或者方法剩添加 @CrossOrigin 注解即可。 老项目以 war 包居多,新项目(Springboot)以 jar 包居多。 后来经过测试,要想静态文件和 Web 服务接口都允许跨域,需要以下条件: 1.Tomcat 设置允许所有跨域,开放最大权限 注意下图中红框部分,笔者当时没注意,导致一直没解决问题。 (1) 当未配置允许跨域时,报跨域错误 浏览器直接访问是正常的: (2)Tomcat conf/web.xml 文件配置允许跨域 配置之后,重启 Tomcat,再次访问则正常: Web 项目,这里指的是 开始阶段发现,配置 Web 服务允许跨域之后不生效。 同时配置允许跨域不生效的原因:个人感觉是因为有啥冲突,AI 的回答是: 参考博客: tomcat 设置允许跨域访问 Tomcat解决跨域问题(Access-Control-Allow-Origin,403,404)解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
Tomcat 配置允许跨域
<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>
importorg.springframework.stereotype.Component;importjavax.servlet.*;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@ComponentpublicclassMyCORSFilterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException,IOException{HttpServletResponseresponse =(HttpServletResponse)servletResponse;Stringorigin =(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);}@Overridepublicvoiddestroy(){}}
Tomcat 同时允许静态文件和 Web 服务跨域
packagecom.mapsharp.map.web.config;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.http.converter.HttpMessageConverter;importorg.springframework.http.converter.StringHttpMessageConverter;importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;importjava.nio.charset.Charset;importjava.util.List;/** * @author * @Description: 设置允许跨域访问static资源 * @date 2019/6/39:26 */@ConfigurationpublicclassWebMvcConfigextendsWebMvcConfigurationSupport{@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){System.out.println("自动配置生效addResourceHandlers");registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");super.addResourceHandlers(registry);}//前端跨域@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping("/**")//设置允许跨域的路径.allowedOrigins("*")//设置允许跨域请求的域名.allowedHeaders("*")//是否允许证书 不再默认开启.exposedHeaders("Access-Control-Allow-Origin,Access-Control-Allow-Credentials")//是否允许证书 不再默认开启.allowCredentials(true)//是否允许证书 不再默认开启.allowedMethods("GET","POST","PUT","OPTIONS","DELETE")//设置允许的方法.maxAge(3600);//跨域允许时间}//为了解决中文编码方式乱码问题@BeanpublicHttpMessageConverter<String>responseBodyConverter(){StringHttpMessageConverterconverter =newStringHttpMessageConverter(Charset.forName("UTF-8"));converter.setWriteAcceptCharset(false);returnconverter;}@BeanpublicObjectMappergetObjectMapper(){returnnewObjectMapper();}@BeanpublicMappingJackson2HttpMessageConvertermessageConverter(){MappingJackson2HttpMessageConverterconverter =newMappingJackson2HttpMessageConverter();converter.setObjectMapper(getObjectMapper());returnconverter;}@OverridepublicvoidconfigureMessageConverters(List<HttpMessageConverter<?>>converters){converters.add(responseBodyConverter());converters.add(messageConverter());}}
<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>
Web 项目配置允许跨域
java
项目,打包的时候基本是选择 war
包或者 jar
包。
本文包含 Tomcat 配置允许跨域、
结果尝试多次均不能达到想要的结果,又经过 Nginx、
war 可以直接在 Tomcat 中部署启动,而 jar 包则往往通过命令启动。
这里介绍一下 Web 项目各种允许跨域配置。