2016-11-01 2 views
9

все. Я новичок в Angular 2 и Spring Framework. Я пробую простой запрос на получение с заголовком авторизации (основной auth).Ответ на предполетный период имеет неверный код состояния HTTP 401 - Весна

Я использую 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

Пожалуйста, помогите, я не знаю, что я не хватает ... Я проверил вокруг много постов уже, но не смог попасть ...

+0

HTTP 401 означает, что ваш запрос не может быть выполнен из-за отсутствия разрешения, проверьте работает –

+0

Можете ли вы удалить response.setHeader («Access-Control-Allow-Credentials», «true»); и попробовать? –

+0

@TharsanSivakumar, получил то же самое, спасибо в любом случае –

ответ

7

избежать фильтрации и установить статус 200, если метод HTTP является OPTIONS

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

Спасибо @Eswar, я больше не получаю ошибку. Однако игнорирует ли запрос OPTIONS хорошую реализацию? Я спрашиваю, потому что я действительно не знаю. –

+0

мы можем проверить заголовки запроса и отправить код состояния без фильтра. браузер делает запрос перед полетом всякий раз, когда мы отправляем авторизацию в заголовке, поэтому мы просто проверяем исходный код и код ошибки ошибки.игнорирование OPTIONS не повлияет на другие методы http, поскольку мы фильтруем, но я не уверен, что это хорошая реализация или нет. – Eswar

3

Если есть кто-нибудь попасть в подобную ситуацию, работающих вокруг с весны Ботинок, Spring Security и клиенты, как угловая 2/4, Я опубликовали результаты here.

Для тех, кто ищет короткий ответ, вы должны настроить две вещи:

  1. С весной Ботинками, рекомендуемым способом включить глобальное 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, вы должны включить CORS на уровне Spring Security, а также, чтобы позволить ему использовать конфигурацию, определенную на уровне Spring MVC, как:

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

Ура !!!

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/17426158) – khelwood

+0

@khelwood обновил ответ, но почему голосование вниз? это что-то вроде того, как судить книгу по обложке? если бы я не обновил ответ, я бы оценил. –

+0

Я не спустил вниз. – khelwood

0

Другой вариант, как в руководстве безопасности пружинного:

в классе конфигурации безопасности, которая расширяет WebSecurityConfigurerAdapter настройки 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); 





} 
Смежные вопросы

 Смежные вопросы