我正在用Spring-boot(在http://localhost:8080)和angular(在http://localhost:80)上構建一個應用程序。彈簧安全的CORS問題
前端和後端代碼由2個不同的服務器提供服務。爲了避免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
塊(error.status = -1),我可以看到此錯誤消息在控制檯中:
XMLHttpRequest無法加載http://localhost:8080/api/login。請求的資源上沒有「Access-Control-Allow-Origin」標題。因此不允許訪問原產地'http://localhost'。
如果我輸入了錯誤的密碼,我也與此錯誤消息到達catch塊:
的XMLHttpRequest無法加載http://localhost:8080/api/login。請求的資源上沒有「Access-Control-Allow-Origin」標題。因此不允許訪問原產地'http://localhost'。該響應具有HTTP狀態代碼401.
我還注意到,當我調用身份驗證端點時,CORS響應標頭丟失。
任何想法?
編輯:它工作如果我手動添加標頭自定義成功處理程序。我寧願Spring-security可以考慮全局CORS配置。
http://stackoverflow.com/questions/35035055/spring-boot-and-cors/35040051#35040051大概這可以節省您的時間:) –