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

慈云数据 6个月前 (05-11) 技术支持 52 0

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

      在这里插入图片描述

      
      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 配置文件允许所有接口跨域,一般不建议这样配置。

      
        cors
        MyCORSFilter
      
      
        cors
        /*
      
        
      

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

      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 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
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon