• tomcat跨域问题CORS踩坑点


    nginx解决跨域比较简单,在location中增加跨域头就可以解决

    1. # 静态资源转发
    2. location / {
    3. add_header Access-Control-Allow-Origin *;
    4. add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
    5. add_header Access-Control-Max-Age 1728000;
    6. root /home/www/cdn;
    7. }

    有时候是没有nginx的场景,需要在tomcat层解决,网络经常给的配置方案是在web.xml中添加CrosFilter来解决。

    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,DELETE</param-value>
    11. </init-param>
    12. </filter>
    13. <filter-mapping>
    14. <filter-name>CorsFilter</filter-name>
    15. <url-pattern>/*</url-pattern>
    16. </filter-mapping>

    在实际使用过程中,前台的ajax请求,会出现preflight预检场景未通过报403问题。

    场景1:接口请求未使用withCredentials时,对跨域要求不高,增加跨域头可以解决

    Access-Control-Allow-Origin:*

    cors.allowed.methods:GET,POST,HEAD,OPTIONS

    场景2:ajax接口请求使用了withCredentials时,由于涉及敏感信息的传递,对跨域的要求更高,其中Access-Control-Allow-Methods 不允许配置*,需要配置指定的发起请求的地址(Origin)

    Access-Control-Allow-Methods://具体请求地址,不能够使用*模糊匹配

    Access-Control-Allow-Credential:true  ,必须要开启

    最后踩坑点:

            1、OPTIONS请求报403,原因是tomcat web.xml中禁用了OPTIONS请求

            2、tomcat 通过web.xml配置CrosFilter过滤器增加这几个头,但实际没生效(理论上是可以的),最后改用了springboot的@Configuration实现corsFilter

    1. @Configuration
    2. public class CorsConfig {
    3. // 当前跨域请求最大有效时长。这里默认1
    4. private static final long MAX_AGE = 24 * 60 * 60;
    5. @Bean
    6. public CorsFilter corsFilter() {
    7. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    8. CorsConfiguration corsConfiguration = new CorsConfiguration();
    9. corsConfiguration.addAllowedOrigin("http://10.10.11.1:8080"); // 1 设置访问源地址,或者http://localhost:7060
    10. corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
    11. corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法,或设置为"GET", "POST", "DELETE", "PUT"
    12. corsConfiguration.setAllowCredentials(true);
    13. corsConfiguration.setMaxAge(MAX_AGE);
    14. source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
    15. return new CorsFilter(source);
    16. }
    17. }

          如何发现问题,Chrome浏览器F12查看接口报preflight报错,此时没有具体的信息,可以打开Console查看,会打印出相关的详细报错:没有请求头Access-Control-Allow-Origin;请求头不允许使用模糊匹配*;必须开启Credential。

  • 相关阅读:
    IDL学习:语法基础-过程和函数
    基于ssm鲜花销商城管理系统
    关于pbootcms中被挂马以后的处理
    Vite 与 Vue Cli 对比 - 尤雨溪: Vite 会取代 vue-cli 吗?
    「Verilog学习笔记」位拆分与运算
    C++智能指针
    Day39 进程
    并发,并行,串行,同步,异步,进程,进程池,线程,线程池
    C/C++统计数 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
    element-ui一个奇葩的故障,非常奇葩,无解
  • 原文地址:https://blog.csdn.net/caoxiao_lcu/article/details/136582764