Я создаю приложение с пружинным ботинком (на http://localhost:8080) и угловым (на http://localhost:80).Проблемы с CORS с пружинной защитой
Внутренний и внутренний код обслуживаются двумя разными серверами. Чтобы избежать проблем с CORS, я использовал промежуточный сервер nginx, но я больше не удовлетворен этим решением. Следовательно, я должен разрешить CORS.
я позволил CORS во всем мире с этими линиями:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost")
.allowCredentials(true)
;
}
}
Это работы для каждого маршрутов для маршрута аутентификации который обрабатывается с весны безопасности, за исключением:
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.successHandler(successHandler())
.failureHandler(failureHandler())
//[...]
}
private AuthenticationSuccessHandler successHandler() {
return (httpServletRequest, httpServletResponse, authentication) ->
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
}
private AuthenticationFailureHandler failureHandler() {
return (httpServletRequest, httpServletResponse, e) -> {
httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
};
}
Вот является код, который отправляет запрос на внешнюю часть:
$http.post('http://localhost:8080/api/login', $.param({'username': username, 'password': password}),
{headers: {'content-type': 'application/x-www-form-urlencoded'}}
).then(function() {})
.catch(function(error) {};
Если я ввожу правильный пароль, код ответа HTTP (который я могу видеть на консоли Chrome) равен 200
, но я все еще добираюсь до блока catch
(с ошибкой.status = -1), и я вижу это сообщение об ошибке в консоли:
XMLHttpRequest не может загрузить http://localhost:8080/api/login. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Происхождение 'http://localhost', следовательно, не допускается.
Если я ввести неправильный пароль, который я также достигнуть блока поймать с этим сообщением об ошибке:
XMLHttpRequest не может загрузить http://localhost:8080/api/login. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Происхождение 'http://localhost', следовательно, не допускается. Ответ имел код состояния HTTP 401.
Я также замечаю, что заголовки ответа CORS отсутствуют, когда я вызываю конечную точку аутентификации.
Любые идеи?
EDIT: он работает, если вручную добавлять заголовки в пользовательский обработчик. Я бы предпочел, чтобы Spring-security могла учитывать глобальную конфигурацию CORS.
http://stackoverflow.com/questions/35035055/spring-boot-and-cors/35040051#35040051 возможно, это может сэкономить ваше время :) –