跨域问题has been blocked by CORS policy: No Access-Control-Allow-Origin和 It does not have HTTP ok status

SpringBoot vue项目发布到服务器出现跨域问题has been blocked by CORS policy: No Access-Control-Allow-Origin 和 Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.

解决springboot项目和Vue项目部署到同一个服务器出现跨域请求问题
has been blocked by CORS policy: No Access-Control-Allow-Origin
网上找了很多方案 列了出来
**
解决方案
加一个过滤器和一个config配置类

@Slf4j
@Configuration
public class AccessControlAllowOriginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        log.info("经过了跨域处理过滤器。。。。。");
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        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-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,token, content-type");
        if (request.getMethod().equals(HttpMethod.OPTIONS.name())){
            response.setStatus(HttpStatus.NO_CONTENT.value());
        }else{
            chain.doFilter(req, response);
        }
    }

    @Override
    public void destroy() {

    }
}


@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 配置所有请求
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}

这是一种解决方案
第二种
在Spring Boot中拥有大量的注解,针对跨域问题,也提供了对应的注解@CrossOrigin,使用方法如下:

	@CrossOrigin(origins = "*")
    @RequestMapping(value = "/get")
    public Result get() {
    }

但是第二种方案需要每个接口都加注解 出于统一处理的便捷性还是加个过滤器吧

以上两种种亲测都可行
但是问题来了 如果以上方式加了还报错 并且response的header正常 错误如下
Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.

原因就是浏览器的预检请求失败 即option请求失败 需要后端放行option请求即可
在spring security放行option请求

.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()

终于解决了!!!

### 解决方案 为了在 IIS 中配置 CORS 以允许前端访问并解决 `No 'Access-Control-Allow-Origin'` 错误,可以通过安装 URL Rewrite ARR (Application Request Routing) 模块来实现资源共享。另一种更简便的方法是在 Web.config 文件中添加必要的 HTTP 响应头。 #### 方法一:通过Web.config文件配置CORS 可以在应用程序的根目录下的 `Web.config` 文件中添加如下配置: ```xml <configuration> <system.webServer> <httpProtocol> <customHeaders> <!-- 允许所有源 --> <add name="Access-Control-Allow-Origin" value="*" /> <!-- 如果需要指定特定名,则替换*为具体的URL --> <!-- <add name="Access-Control-Allow-Origin" value="http://example.com" /> --> <!-- 支持预检请求方法 --> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> <!-- 支持自定义头部字段 --> <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" /> </customHeaders> </httpProtocol> <!-- 处理OPTIONS请求 --> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> <!-- 添加处理程序映射以便能够响应OPTIONS请求 --> <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" responseBufferLimit="0"/> </handlers> <!-- 配置IIS模块以确保正确处理CORS请求 --> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> </system.webServer> </configuration> ``` 上述配置不仅设置了 `Access-Control-Allow-Origin` 响应头[^2],还增加了对其他必要头部的支持以及针对 `OPTIONS` 请求特别处理的能力。这有助于满足浏览器发起的各种类型的请求需求。 #### 方法二:使用官方Microsoft Cors Module 除了手动编辑 `web.config` 文件外,还可以考虑部署 Microsoft 提供的专门用于管理 CORS 的 IIS 模块——Cors Module。此方式提供了图形界面操作选项,简化了配置流程,并且能更好地与其他安全特性集成在一起工作。 下载地址:<https://www.iis.net/downloads/microsoft/iis-cors-module> 安装完成后,在 IIS Manager 中找到对应的站点或应用池,右键点击选择“启用 CORS”,按照向导提示完成设置即可。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值