Angularjs Spring安全性的CORS问题
我正在构建一个带有Spring boot(打开)和angular(打开)的应用程序 前端和后端代码由两个不同的服务器提供服务。为了避免CORS问题,我曾经设置了一个中间nginx服务器,但我对这个解决方案不再满意。因此,我必须允许CORS 我允许CORS在全球范围内使用以下行:Angularjs Spring安全性的CORS问题,angularjs,spring-security,spring-boot,Angularjs,Spring Security,Spring Boot,我正在构建一个带有Spring boot(打开)和angular(打开)的应用程序 前端和后端代码由两个不同的服务器提供服务。为了避免CORS问题,我曾经设置了一个中间nginx服务器,但我对这个解决方案不再满意。因此,我必须允许CORS 我允许CORS在全球范围内使用以下行: @Configuration public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public voi
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost")
.allowCredentials(true)
;
}
}
此适用于每个路由,但使用Spring security处理的身份验证路由除外:
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。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”
如果我输入了错误的密码,我也会通过以下错误消息到达catch块:
无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。响应的HTTP状态代码为401
我还注意到,在调用身份验证端点时,CORS响应头丢失
有什么想法吗
编辑:如果我在自定义成功处理程序中手动添加标题,它会起作用。我希望Spring security能够考虑全局CORS配置。根据我的经验,您需要在CORS中包含端口号,来自浏览器的错误消息有点误导
您可以通过检查网络并检查请求头的
来源
字段来验证这一点。响应头的Access Control Allow Origin
中的值必须与协议和端口完全匹配。根据我的经验,您需要在CORS中包含端口号,来自浏览器的错误消息有点误导
您可以通过检查网络并检查请求头的
来源
字段来验证这一点。响应头的Access Control Allow Origin
中的值必须与包括协议和端口在内的值完全匹配。您应该查看Spring网站。有一些用于使用web服务和管理COR的解决方案:
- 为RESTful Web服务启用跨源请求:
- 使用AngularJS消费RESTful Web服务:
- 为RESTful Web服务启用跨源请求:
- 使用AngularJS消费RESTful Web服务:
将其添加到服务方法中。这背后的想法是通过服务本身启用CORS请求@交叉原点(原点=”http://localhost:8080“”
- 使用JSONP,但这有一定的限制。而且我没有成功地实现它,所以我使用了上面的选项
将其添加到服务方法中。这背后的想法是通过服务本身启用CORS请求@交叉原点(原点=”http://localhost:8080“”
- 使用JSONP,但这有一定的限制。而且我没有成功地实现它,所以我使用了上面的选项 可能这可以节省您的时间:)可能这可以节省您的时间:)
- 有完全相同的问题,你可以做两件事
同样的问题你可以做两件事