2016-11-01 30 views
9

mọi người. Tôi mới vào Angular 2 và Spring Framework. Tôi đang thử một yêu cầu nhận đơn giản với tiêu đề ủy quyền (auth cơ bản).Phản hồi cho preflight có mã trạng thái HTTP không hợp lệ 401 - Spring

Tôi đang sử dụng Khởi động mùa xuân (1.2.6.RELEASE), cũng có thể có liên quan. Cấu hình CORS của tôi trông như thế này.

@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() { 
} 

} 

Và đây là những gì nó trông giống như từ phía khách hàng

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); 
} 

tôi tiếp tục nhận được:

XMLHttpRequest không thể tải http://localhost:8080/api/login?username=user. Đáp ứng cho preflight có hợp lệ mã trạng thái HTTP 401

Hãy giúp đỡ, tôi không biết những gì tôi đang mất tích ... Tôi đã kiểm tra xung quanh rất nhiều bài viết đã được nhưng không thể đạt được điều đó ...

+0

HTTP 401 có nghĩa là yêu cầu của bạn không thể thực hiện vì thiếu giấy phép, kiểm tra xem đang làm việc –

+0

Bạn có thể xóa response.setHeader ("Access-Control-Allow-Credentials", "true") hay không; và thử? –

+0

@TharsanSivakumar, có cùng suy nghĩ, cảm ơn anyway –

Trả lời

7

tránh lọc và sửa status của 200 khi phương pháp http là OPTIONS

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

Cảm ơn @Eswar, tôi không nhận được lỗi nữa. Tuy nhiên, bỏ qua OPTIONS có yêu cầu triển khai tốt không? Tôi hỏi vì tôi thực sự không biết. –

+0

chúng tôi có thể xác thực tiêu đề yêu cầu và gửi mã trạng thái mà không cần bộ lọc. trình duyệt đang thực hiện yêu cầu preflight bất cứ khi nào chúng tôi gửi cho phép trong tiêu đề, vì vậy chúng tôi chỉ đang xác thực xuất xứ và ném mã trạng thái lỗi.bỏ qua OPTIONS sẽ không ảnh hưởng đến các phương pháp http khác như chúng tôi đang lọc, nhưng tôi không chắc chắn rằng nó có thực hiện tốt hay không. – Eswar

3

Nếu có bất cứ ai đi vào các tình huống tương tự làm việc xung quanh với mùa xuân Boot, xuân an và khách hàng như góc 2/4, tôi đã đã đăng những phát hiện here.

Đối với những người đang tìm kiếm một câu trả lời ngắn, bạn phải cấu hình hai điều:

  1. Với mùa xuân Boot, cách khuyến khích để kích hoạt tính năng toàn cầu CORS là tuyên bố trong Spring MVC và kết hợp với fine- grained @CrossOrigin cấu hình như:

    @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. Sau đó, khi làm việc với xuân an, bạn phải kích hoạt CORS ở cấp xuân an cũng như để cho phép nó để tận dụng cấu hình được xác định ở cấp Spring MVC như:

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

Chúc mừng !!!

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/chất lượng thấp-bài viết/17426158) – khelwood

+0

@khelwood cập nhật câu trả lời, nhưng tại sao bỏ phiếu xuống ?? điều này giống như đánh giá một cuốn sách bằng bìa? nếu tôi không cập nhật câu trả lời, tôi sẽ đánh giá cao. –

+0

Tôi đã không downvote. – khelwood

0

Một tùy chọn khác như trong hướng dẫn an ninh mùa xuân:

trong lớp cấu hình an ninh kéo dài WebSecurityConfigurerAdapter cấu hình CORS()

protected void configure(HttpSecurity http) throws Exception { 

       http 
         .cors().and().**this will use corsConfigurationSource by** default. 


    so lets define corsConfigurationSource 

    // other criteria 
    } 

**so lets define corsConfigurationSource** 

@Bean CorsConfigurationSource corsConfigurationSource() { 

CorsConfiguration configuration = new CorsConfiguration(); 

configuration.setAllowedOrigins(Arrays.asList("http://myufrontend.com")); 

configuration.setAllowedMethods(Arrays.asList("GET", "POST")); 

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 

source.registerCorsConfiguration("/**", configuration); 





} 
Các vấn đề liên quan