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

tomcat解决跨域访问问题配置 tomcat解决跨域访问问题,具体配置如下: 1、修改tomcat下的Conf/web.xml文件,在该文件内容中新增以下配置,注意,若该web.xml中存在其它filter,则需要将该filter放在所有filter前面; CorsFilter org.apache.catalina.filters.CorsFilter cors.allowed.methods GET,POST,HEAD,OPTIONS,PUT cors.allowed.headers <!--注意,若你的应用中不只有这些文件头,则需要将你应用中需要传的文件头也加上; 例如:我的应用中需要在header中传token,所以这里的值就应该是下面的配置,在原有基础上将token加上,否则,应用就不会被允许调用 token,Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers --> Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers true CorsFilter /* 立即下载
AI摘要

本文聚焦于解决Tomcat跨域问题,涵盖Tomcat配置允许跨域、Web项目配置允许跨域以及两者同时允许跨域三部分。介绍了Tomcat静态文件和Web项目不同的跨域配置方式,指出同时配置跨域可能冲突,给出了静态文件和Web服务同时跨域的条件。

解决 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 文件配置允许跨域

在这里插入图片描述

<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)

tomcat跨域解决方案 解决tomcat在IP 和端口不同时引起的跨域问题,解决方案,通过编写crossDomain.xml文件 立即下载

相关推荐

tomcat服务器配置的跨域允许

打开下面链接,直接免费下载资源: https://renmaiwang.cn/s/g4xns 在部署tomcat服务器之后,访问发生跨域问题。其中包含了所需的cors-filter-1.7版本和java-property-utils-1.9组件。经测试没有问题,需特别注意的是资源的命名空间设置为com.thetransactioncompany.cors 在部署了Tomcat服务器之后,开发者经常会遇到跨域访问问题。为了解决这个问题,配置服务器允许跨域请求变得至关重要。本文将会详细介绍如何配置Tomcat以解决跨域问题,并提供对应的资源下载链接和注意事项。 跨域资源共享(CORS)是一种安全机制,它允许一个域上的Web应用访问另一个域的资源。在Web开发中,这是常见的问题,尤其是在前后端分离的架构中。为了解决Tomcat服务器中的跨域问题,需要正确配置CORS策略。 具体配置过程包括以下几个步骤: 1. 下载并添加cors-filter-1.7版本到Tomcat的lib目录中。这个过滤器能够帮助我们设置响应头,以满足CORS的需求。 2. 将java-property-utils-1.9组件也添加到lib目录下。这个组件提供了一些实用的Java属性操作工具,可能在配置过程中需要使用。 3. 修改Tomcat的配置文件(通常是web.xml)来添加CORS过滤器的定义。在这里,开发者需要详细配置过滤器的具体参数,比如允许的域、请求方法和头部信息等。 4. 设置好过滤器后,需要确保所有资源的命名空间与配置文件中设置的一致。这是非常关键的一步,错误的命名空间设置会导致配置不生效。 5. 测试配置是否生效。开发者可以通过发送预检请求,检查服务器是否返回了正确的CORS响应头。常见的响应头包括Access-Control-Allow-Origin、Access-Cont

tomcat 设置允许跨域访问

既然想到使用tomcat进行跨域的设置,而不使用在项目中设置header来解决,说明你也是tomcat 下的资源需要做跨域处理吧?这也是一个统一的允许跨域设置,tomcat下的所有请求都将放开,请注意。 具体步骤: 1.首先找到你的tomcat所在路径,并在conf文件夹下找到 web.xml 2.打开该文件,在以下位置加上这段: <filter> <filter-name>CorsFilter</filter-name> <filter-class&g

m0_67403013的博客 7816

深入探索 ClickHouse:性能优化之道

在大数据处理的广袤天地里,ClickHouse 宛如一颗璀璨的明星,以其卓越的性能为海量数据的存储与查询提供了强大助力。但要想让 ClickHouse 发挥出极致效能,性能优化至关重要。今天,就让我们一同深入探寻 ClickHouse 的性能优化之路。

arnold66的专栏 1547
上一篇: 搭建支持国密GmSSL的Nginx环境
下一篇: CentOS部署FastDFS+Nginx并实现远程访问本地服务器中文件
AIGC镜像空间
博客等级 码龄5年 4万+粉丝 689原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值