Angularjs Spring安全性的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

我正在构建一个带有Spring boot(打开)和angular(打开)的应用程序

前端和后端代码由两个不同的服务器提供服务。为了避免CORS问题,我曾经设置了一个中间nginx服务器,但我对这个解决方案不再满意。因此,我必须允许CORS

我允许CORS在全球范围内使用以下行:

@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服务:

您应该看看Spring网站。有一些用于使用web服务和管理COR的解决方案:

  • 为RESTful Web服务启用跨源请求:
  • 使用AngularJS消费RESTful Web服务:

    • 有完全相同的问题,你可以做两件事

    • @交叉原点(原点=”http://localhost:8080“”
      将其添加到服务方法中。这背后的想法是通过服务本身启用CORS请求
    • 使用JSONP,但这有一定的限制。而且我没有成功地实现它,所以我使用了上面的选项

    • 同样的问题你可以做两件事

    • @交叉原点(原点=”http://localhost:8080“”
      将其添加到服务方法中。这背后的想法是通过服务本身启用CORS请求
    • 使用JSONP,但这有一定的限制。而且我没有成功地实现它,所以我使用了上面的选项
    • 可能这可以节省您的时间:)可能这可以节省您的时间:)