tomcat跨域问题CORS踩坑点

本文介绍了如何在Nginx和Tomcat中配置CORS策略以解决跨域问题,包括静态资源转发、preflight预检场景处理以及OPTIONS请求的管理。特别关注了Ajax请求中withCredentials启用时的安全要求和常见坑点。
摘要由CSDN通过智能技术生成

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

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

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

<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,DELETE</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</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

@Configuration
public class CorsConfig {

    // 当前跨域请求最大有效时长。这里默认1天
    private static final long MAX_AGE = 24 * 60 * 60;

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("http://10.10.11.1:8080"); // 1 设置访问源地址,或者http://localhost:7060
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法,或设置为"GET", "POST", "DELETE", "PUT"
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }
}

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

要解决跨域问题,需要在服务器端设置响应头信息,告诉浏览器该请求允许跨域访问。具体步骤如下: 1. 在服务器端设置响应头信息。 在服务器端的响应头信息中添加Access-Control-Allow-Origin字段,指定允许跨域访问的源地址。 例如,在Node.js中可以使用以下代码: ``` res.setHeader('Access-Control-Allow-Origin', '*'); ``` 这里的*表示允许所有来源进行跨域请求,也可以指定具体的源地址。 2. 设置响应头信息中的其他字段。 除了Access-Control-Allow-Origin字段,还需要设置其他字段,例如Access-Control-Allow-Methods、Access-Control-Allow-Headers等。这些字段的作用是告诉浏览器该请求允许的方法、头信息等。 例如,在Node.js中可以使用以下代码: ``` res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); ``` 这里的Access-Control-Allow-Methods字段表示允许POST、GET、OPTIONS方法的请求,Access-Control-Allow-Headers字段表示允许Content-Type头信息的请求。 3. 处理OPTIONS请求。 在跨域请求中,浏览器会先发送一个OPTIONS请求,用于询问服务器是否允许实际请求。因此,需要在服务器端处理该请求,返回响应头信息中的字段。 例如,在Node.js中可以使用以下代码: ``` if (req.method === 'OPTIONS') { res.writeHead(200, { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }); res.end(); } ``` 这里的req.method表示请求的方法,如果是OPTIONS请求,就返回响应头信息中的字段。 以上就是实现简单的跨域问题cors的步骤,需要注意的是,不同的服务器端语言和框架实现方式可能有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值