Java 飞行前的响应具有无效的HTTP状态代码401-Spring

Java 飞行前的响应具有无效的HTTP状态代码401-Spring,java,spring,angular,cors,Java,Spring,Angular,Cors,各位。 我是Angular 2和Spring框架的新手。 我正在尝试一个带有授权头(basicauth)的简单get请求 我正在使用SpringBoot(1.2.6.RELEASE),这也可能是相关的。 我的CORS配置如下所示 @Component public class SimpleCorsFilter implements Filter { private final Logger log = LoggerFactory.getLogger(SimpleCorsFilter.class

各位。 我是Angular 2和Spring框架的新手。 我正在尝试一个带有授权头(basicauth)的简单get请求

我正在使用SpringBoot(1.2.6.RELEASE),这也可能是相关的。 我的CORS配置如下所示

@Component
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", request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, authorization, x-auth-token");

    chain.doFilter(req, res);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}
下面是客户端的外观

    this.headers.append('Authorization', 'Basic dXNlcjphZG1pbg==');
    return this.http
            .get(`http://localhost:8080/api/login?username=${username}`, {headers : this.headers} )
            .map(response => response.json().data as any);
}
我不断得到:

无法加载XMLHttpRequest . 飞行前响应 具有无效的HTTP状态代码401

请帮忙,我不知道我错过了什么。。。
我已经检查了很多帖子,但都没有找到…

避免过滤,并在http方法为OPTIONS时设置状态200

if("OPTIONS".equalsIgnoreCase(request.getMethod())) {
    response.setStatus(HttpServletResponse.SC_OK);
} else {
    chain.doFilter(req, res);
}

如果有人在使用Spring Boot、Spring Security和angular 2/4之类的客户端时遇到类似情况,我已经发布了这些发现

对于那些正在寻找简短答案的人,您必须配置两件事:

  • 使用Spring Boot,启用全局CORS的推荐方法是在Spring MVC中声明,并结合细粒度的
    @CrossOrigin
    配置,如下所示:

    @Configuration
    public class CorsConfig {
    
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
                            .allowedHeaders("*");
                }
            };
        }
    }
    
  • 然后,在使用Spring Security时,您必须在Spring Security级别启用CORS,以允许它利用Spring MVC级别定义的配置,如下所示:

    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.cors().and()...
        }
    }
    

  • 干杯

    另一个选项,如spring安全指南:

    在扩展WebSecurity ConfigureAdapter configure cors()的安全配置类中


    这可能会很晚,但这可以解决一些问题,经过长时间的工作,我找到了答案

    public class SecurityConfig extends WebSecurityConfigurerAdapter
    {
        @Override
        public void configure( WebSecurity web ) throws Exception
        {
            web.ignoring().antMatchers( HttpMethod.OPTIONS, "/**" );
        }
    }
    

    REFERE

    HTTP 401表示由于缺少授权而无法满足您的请求,请检查是否正常。能否删除响应。setHeader(“访问控制允许凭据”,“true”);试试看?@TharsanSivakumar,也有同样的想法,无论如何谢谢相关的:谢谢@Eswar,我再也不会犯错误了。然而,忽略选项请求是一个好的实现吗?我这样问是因为我真的不知道。我们可以验证请求头并发送状态代码,而无需筛选。每当我们在标头中发送授权时,浏览器就会发出飞行前请求,所以我们只是验证来源并抛出错误状态代码。忽略选项不会影响其他http方法,因为我们正在进行筛选,但我不确定它的实现是否良好。虽然此链接可能会回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-@克尔伍德更新了答案,但为什么不投票呢??这有点像是根据封面判断一本书吗?如果我没有更新答案的话,我会很感激的。这应该是最重要的答案——经过数小时的Spring文档检索,github和SOI花了几个小时才找到这个答案。
    public class SecurityConfig extends WebSecurityConfigurerAdapter
    {
        @Override
        public void configure( WebSecurity web ) throws Exception
        {
            web.ignoring().antMatchers( HttpMethod.OPTIONS, "/**" );
        }
    }