解决 Tomcat 跨域题目 - Tomcat 设置静态文件和 Java Web 服务(Spring MVC ...

打印 上一主题 下一主题

主题 907|帖子 907|积分 2721

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

  1. <filter>
  2. <filter-name>CorsFilter</filter-name>
  3. <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  4. <init-param>
  5. <param-name>cors.allowed.origins</param-name>
  6. <param-value>*</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>cors.allowed.methods</param-name>
  10. <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  11. </init-param>
  12. <init-param>
  13. <param-name>cors.allowed.headers</param-name>
  14. <param-value>*</param-value>
  15. </init-param>
  16. <init-param>
  17. <param-name>cors.exposed.headers</param-name>
  18. <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  19. </init-param>
  20. <init-param>
  21. <param-name>cors.support.credentials</param-name>
  22. <param-value>true</param-value>
  23. </init-param>
  24. </filter>
  25. <filter-mapping>
  26. <filter-name>CorsFilter</filter-name>
  27. <url-pattern>/*</url-pattern>
  28. </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 设置文件允许全部接口跨域,一样平常不建议如许设置。
  1. <filter>
  2.   <filter-name>cors</filter-name>
  3.   <filter-class>MyCORSFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.   <filter-name>cors</filter-name>
  7.   <url-pattern>/*</url-pattern>
  8. </filter-mapping>
复制代码
过滤类,恣意目次即可,以根目次为例,其他目次需要加上包路径:
  1. import org.springframework.stereotype.Component;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServletResponse;
  4. import java.io.IOException;
  5. @Component
  6. public class MyCORSFilter implements Filter {
  7.     @Override
  8.     public void init(FilterConfig filterConfig) throws ServletException {
  9.     }
  10.     @Override
  11.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, IOException {
  12.         HttpServletResponse response = (HttpServletResponse) servletResponse;
  13.         String origin = (String) servletRequest.getRemoteHost()+":"+servletRequest.getRemotePort();
  14.         response.setHeader("Access-Control-Allow-Origin", "*");
  15.         response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
  16.         response.setHeader("Access-Control-Max-Age", "3600");
  17.         response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
  18.         response.setHeader("Access-Control-Allow-Credentials","true");
  19.         filterChain.doFilter(servletRequest, servletResponse);
  20.     }
  21.     @Override
  22.     public void destroy() {
  23.     }
  24. }
复制代码
(2)继续 WebMvcConfigurationSupport 允许跨域
Springboot 框架下的设置,允许全部接口跨域,Springboot 环境下测试生效,Spring MVC环境下测试未生效。
  1. package com.mapsharp.map.web.config;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.http.converter.HttpMessageConverter;
  6. import org.springframework.http.converter.StringHttpMessageConverter;
  7. import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
  8. import org.springframework.web.servlet.config.annotation.CorsRegistry;
  9. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
  11. import java.nio.charset.Charset;
  12. import java.util.List;
  13. /**
  14. * @author
  15. * @Description: 设置允许跨域访问static资源
  16. * @date 2019/6/39:26
  17. */
  18. @Configuration
  19. public class WebMvcConfig extends WebMvcConfigurationSupport {
  20.     @Override
  21.     public void addResourceHandlers(ResourceHandlerRegistry registry) {
  22.         System.out.println("自动配置生效addResourceHandlers");
  23.         registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
  24.         super.addResourceHandlers(registry);
  25.     }
  26.     //前端跨域
  27.     @Override
  28.     public void addCorsMappings(CorsRegistry registry) {
  29.         registry.addMapping("/**")//设置允许跨域的路径
  30.                 .allowedOrigins("*")//设置允许跨域请求的域名
  31.                 .allowedHeaders("*")//是否允许证书 不再默认开启
  32.                 .exposedHeaders("Access-Control-Allow-Origin,Access-Control-Allow-Credentials")//是否允许证书 不再默认开启
  33.                 .allowCredentials(true)//是否允许证书 不再默认开启
  34.                 .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE")//设置允许的方法
  35.                 .maxAge(3600);//跨域允许时间
  36.     }
  37.     //为了解决中文编码方式乱码问题
  38.     @Bean
  39.     public HttpMessageConverter<String> responseBodyConverter() {
  40.         StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
  41.         converter.setWriteAcceptCharset(false);
  42.         return converter;
  43.     }
  44.     @Bean
  45.     public ObjectMapper getObjectMapper() {
  46.         return new ObjectMapper();
  47.     }
  48.     @Bean
  49.     public MappingJackson2HttpMessageConverter messageConverter() {
  50.         MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
  51.         converter.setObjectMapper(getObjectMapper());
  52.         return converter;
  53.     }
  54.     @Override
  55.     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  56.         converters.add(responseBodyConverter());
  57.         converters.add(messageConverter());
  58.     }
  59. }
复制代码
(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)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表