已被 CORS 策略阻止:对预检请求的响应未通过

Posted

技术标签:

【中文标题】已被 CORS 策略阻止:对预检请求的响应未通过【英文标题】:has been blocked by CORS policy: Response to preflight request doesn't pass 【发布时间】:2019-11-18 15:20:36 【问题描述】:

我使用 angular 和 springboot 创建了一个应用程序,用于使用 spring 安全性进行基本身份验证,但我收到 401 错误 ..我是 springboot 的新手

@Configuration
@EnableWebSecurity
public class SpringSecurityConfigurationBasicAuth extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
                .anyRequest().authenticated()
                .and()
            //.formLogin().and()
            .httpBasic();
    

“从源 'http://localhost:4200' 访问 XMLHttpRequest 在 'http://localhost:8080/hello-world/path-variable/MSD' 访问控制检查:它没有 HTTP ok 状态。”

【问题讨论】:

我应该添加哪个插件?? 你不应该添加任何 chrome 插件。或者您的后端 API 确实应该在生产中从其他域/端口调用,并且您应该在后端 API 上添加 CORS 支持,或者不应该,因此您的开发环境应该通过提供服务来模仿生产环境来自同一主机/端口的后端和前端。您通常通过使用 Angular CLI 服务器作为后端 API 的代理来做到这一点。 github.com/angular/angular-cli/blob/master/docs/documentation/… @Sachi.Dila 不建议在没有警告的情况下危及网络安全的解决方案。当您安装 cors 插件时,您允许任何站点访问任何其他站点,包括允许从attacker.example.com 访问 gmail.com。过去曾发生过这样的攻击,因为粗心的开发人员不明白为什么要实施某种保护 AFAIR 当您希望允许来自不同来源的经过身份验证的访问并且这些请求不会被您的浏览器停止时,您的后端必须明确地“允许”这些来源通过“Access-Control-Allow-”告诉浏览器Origin”标头列出了允许的来源。 @MONI SHANKAR 请尝试使用我的代码,我认为它可以解决您的问题。 【参考方案1】:

我也遇到了与 angulat7 和 spring boot 相同的问题,我通过添加以下配置解决了

 @Configuration
    public class SpringDataRestConfiguration extends RepositoryRestConfigurerAdapter 

        @Override
        public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) 

        config.getCorsRegistry().addMapping("/**").allowedOrigins("*").allowedHeaders("*").allowedMethods("GET", "POST", "PATCH", "PUT", "DELETE");
        

    

【讨论】:

这是否适用于身份验证?上次我检查时,“*”允许的来源被浏览器解释为“不安全”,因此不允许发送身份验证标头。 我指的是***.com/questions/19743396/…【参考方案2】:

您可以尝试以下方法 在controller 的顶部,您可以添加@CrossOrigin(origins = "*", allowedHeaders = "*") 或根据需要自定义

...
@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
public class UserController 
    // Methods

...

请尝试上述解决方案,如果这不起作用,请告诉我

编辑 1: 您也可以尝试使用CORS 选项创建过滤器:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1)
public class SimpleCORSFilter implements Filter 

    private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);

    public SimpleCORSFilter() 
        log.info("SimpleCORSFilter init");
    

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException 

        // HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

        chain.doFilter(req, res);
    

    @Override
    public void init(FilterConfig filterConfig) 
    

    @Override
    public void destroy() 
    


请尝试filters 方法,如果不起作用,请告诉我

【讨论】:

@CrossOrigin(origins = "localhost:4200") @RestController public class HelloWordlController @GetMapping(path = "/hello-world") public String helloWorld() ......那部分我已经添加了,我也尝试了你的代码,但它不起作用兄弟 @MONISHANKAR 您是否添加了凭据允许?否则您的浏览器将不会发送任何内容。 @MONISHANKAR,添加了基于filters 的解决方案。请检查一次 @SagarCh 感谢您的代码,但我认为您的代码与 servlet 相关,并且 m 使用带有 springboot 安全性的 angular7..M 不确定它是否会工作..

以上是关于已被 CORS 策略阻止:对预检请求的响应未通过的主要内容,如果未能解决你的问题,请参考以下文章

来源已被 CORS 策略阻止 对预检请求的响应未通过访问控制检查

domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

如何解决这个“http://localhost:8080”已被 CORS 策略阻止:对预检请求的响应未通过 vueJS 中的访问控制?

角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查

CORS 策略已阻止从源“null”访问 XMLHttpRequest:对预检请求的响应未通过访问控制 [重复]

被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP OK 状态