2015-08-28 1 views
0

Я получал эту ошибку при вызове '/ oauth/token', когда я делал HTTP-вызов экземпляра сервера, работающего в моей собственной системе. Я исправил это, создав фильтр так:Spring Security OAuth2: канал предпросмотра CORS не удался

@Component 
public class SimpleCORSFilter implements Filter { 

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    HttpServletResponse response = (HttpServletResponse) res; 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); 
    HttpServletRequest httpServletRequest = (HttpServletRequest) req; 
    if (httpServletRequest.getMethod() != "OPTIONS") { 
     chain.doFilter(req, res); 
    } else { 
     // In case of HTTP OPTIONS method, just return the response 
    } 
} 

я добавил его в качестве фильтра в WebConfigurer:

private void initCORSFilter(ServletContext servletContext, EnumSet<DispatcherType> disps) { 
    log.debug("Registering CORS Filter"); 
    FilterRegistration.Dynamic corsFilter = servletContext.addFilter("corsFilter", new SimpleCORSFilter()); 
    Map<String, String> parameters = new HashMap<>(); 
    corsFilter.setInitParameters(parameters); 
    corsFilter.addMappingForUrlPatterns(disps, true, "/*"); 
    corsFilter.setAsyncSupported(true); 
} 

Я получаю эту ошибку в FireFox:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://182.176.221.94:9091/ams/oauth/token. (Reason: CORS preflight channel did not succeed). 

В Короче говоря, я убедился, что вызов preflight OPTIONS всегда получает ответ, чтобы продолжить. Это работало на моей собственной системе, но теперь, когда экземпляр сервера развернут на сервере Linux, я снова получаю эту проблему. И я получаю это только при вызове «oauth/token», все остальные звонки работают нормально.

Что я могу сделать, чтобы избавиться от этого. Любая помощь?

ответ

2

Ваш фильтр не обязательно должен быть аннотирован @Component, и он должен быть отображен с соответствующим шаблоном url в классе WebConfigurer, как и другие фильтры, используемые в JHipster.

Также ваш фильтр не должен прерывать цепь фильтра, как это делается для ОПЦИЙ. Невозможно разрешить метод OPTIONS в заголовке, а затем не возвращать заголовки, если вы обрабатываете запрос OPTIONS.

+0

У меня есть вопрос. Взгляни, пожалуйста. Я уже добавил фильтр в WebConfigurer. Удаление атрибута @Component позволяет остановить работу даже на моей локальной машине. –

+0

это работает для меня без @Component, поэтому что-то не так в вашем проекте. –

+0

. Я добавил дополнительные сведения о несогласованности в вашем фильме о ВАРИАНТАХ –

0

Проблема была в том, что я использовал! = Сравнение для if (httpServletRequest.getMethod() != "OPTIONS". Вместо этого я изменил его на if (!httpServletRequest.getMethod().equalsIgnoreCase("OPTIONS")), и он сработал. Это может иметь какое-то отношение к тому факту, что я тестировал на локальном компьютере при запуске кодовой базы, но создал WAR-файл из него и развернулся на сервере, где он не работал. Я не уверен, в чем именно причина, но это решило проблему.