web-dev-qa-db-ja.com

プリフライトの応答に無効なHTTPステータスコード401-Spring

全員。私はAngular 2とSpring Frameworkに不慣れです。認証ヘッダー(基本認証)を使用した単純なgetリクエストを試行しています。

私はSpring Boot(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:// localhost:8080/api/login?username = user 。プリフライトの応答に無効なHTTPステータスコード401が含まれています

助けてください、何が欠けているのか分かりません...私はすでに多くの投稿をチェックしましたが、そこに到達できませんでした...

12
Manuel Zamith

フィルタリングを回避し、httpメソッドがオプションの場合はステータス200を設定

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

これは非常に遅くなる可能性がありますが、これはいくつかの問題を解決できる可能性があります。長い時間の後に、私は答えを見つけました

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

参照 https://stackoverflow.com/a/45830981/372476

7
kvk95

Spring Boot、Spring Security、およびangular 2/4のようなクライアントを使用して対処している同様の状況に陥っている人がいる場合は、調査結果を投稿しました here

短い答えを探している人のために、あなたは2つのことを構成する必要があります:

  1. 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("*");
                }
            };
        }
    }
    
  2. 次に、Spring Securityを使用しているときに、Spring MVCレベルで定義されている構成を活用できるように、Spring SecurityレベルでCORSを有効にする必要があります。

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

乾杯!!!

5
Yogen Rai