Spring-boot / Http call angular 2的角度没有'Access-Control-Allow-Origin' [重复]

Posted

技术标签:

【中文标题】Spring-boot / Http call angular 2的角度没有\'Access-Control-Allow-Origin\' [重复]【英文标题】:No 'Access-Control-Allow-Origin' in angular with Spring-boot / Http call angular 2 [duplicate]Spring-boot / Http call angular 2的角度没有'Access-Control-Allow-Origin' [重复] 【发布时间】:2018-08-01 20:00:54 【问题描述】:

我正在尝试将数据从 spring boot server 获取到 angular 应用程序 通过 angular http 调用。我还为 Spring Boot 应用程序添加了 security 依赖项。

当我尝试使用浏览器时,它会出现。

一旦我在 Intellij 的控制台中输入密码,它就会显示响应。

当我尝试使用 angular http 调用时,它会失败并显示错误 主题。

我的角度组件有以下代码。

constructor(private http: HttpClient)  
    http.get('http://localhost:8080/resource').subscribe(data => this.greeting = data);

我的 Spring Boot 应用程序有以下代码

@RequestMapping("/resource")
public Map<String,Object> home() 
      Map<String,Object> model = new HashMap<String,Object>();
      model.put("id", UUID.randomUUID().toString());
      model.put("content", "Hello World");
      return model;

我也读过跨域资源共享(CORS),但不清楚如何将这些应用到角度。

我的错误是:

【问题讨论】:

与角度无关。您必须在服务器中启用 CORS。查看如何在您的服务器中执行此操作。 我想我必须修复有角的一面。谢谢你 基本上,您必须在服务器的 HTTP 选项响应的标头中将 Access-Control-Allow-Origin 设置为您的 url。 这篇文章可能对你有帮助:spring.io/guides/gs/rest-service-cors/#_enabling_cors @CrossOrigin(origins = "*") 对此不起作用。 @NiK648。 【参考方案1】:

检查服务器是否也接受http方法'OPTIONS'。因为如果域不同,浏览器默认发送 OPTIONS 请求,响应应该是成功 200。如果它是一个弹簧后端

public class CorsFilter implements Filter 

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
    final HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
    if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) 
        response.setStatus(HttpServletResponse.SC_OK);
     else 
        chain.doFilter(req, res);
    

【讨论】:

因为我是新手,你能解释一下把这段代码放在哪里吗? 我认为你的答案会和我的一致。请告诉我如何将其应用于我的代码。 @VithuBati 在过滤器本身,你可以放。如果它解决了您的问题,我更新了我的代码并接受它作为正确答案。【参考方案2】:

控制器中的每个方法都需要单独允许跨域。只需在方法顶部添加 @CrossOrigin(origins = "*"),希望这能解决问题。

@CrossOrigin(origins = "*")
@RequestMapping("/resource")
    public Map<String,Object> home() 
        Map<String,Object> model = new HashMap<String,Object>();
        model.put("id", UUID.randomUUID().toString());
        model.put("content", "Hello World");
        return model;

【讨论】:

不,我试过了。它不起作用。我不应该在这里设置 Access-Control-Allow-Credentials 吗? 你不需要;只需为方法添加 Method 类型,例如 GET 或 POST。 你的意思是@GetMapping(path = "/resource") 不,我试过了。它说请求的资源上不存在“Access-Control-Allow-Origin”标头。【参考方案3】:

在 scala + spring boot 中可以添加 cors 映射

class WebAppConfig extends WebMvcAutoConfigurationAdapter 

  @Value("$cors.origin")
  private val corsOrigin: String = "all"

  override def addCorsMappings(registry: CorsRegistry): Unit = 
    if(corsOrigin=="all")
      registry.addMapping("/**")
    else
      registry.addMapping("/**").allowedOrigins(corsOrigin.split(","):_*)
    
  


【讨论】:

【参考方案4】:

我在角度应用程序中所做的事情是正确的,必须纠正 仅限我的 Spring Boot 应用程序。

我所做的唯一更改是创建名为 WebSecurityConfig.

的配置文件
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.cors();
    

    @Bean
    CorsConfigurationSource corsConfigurationSource() 
        UrlBasedCorsConfigurationSource source = new
                UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
        return source;
    

【讨论】:

不适合我 参考这个***.com/questions/48926480/… 我只喜欢上面的例子,但在我的例子中,oauth 安全也在那里。你的例子对我不起作用,为什么?请通过此链接访问我的问题***.com/questions/50579277/… 检查这个。 spring.io/guides/tutorials/spring-boot-oauth2 我的案例是 spring mvc 4.3 版本而不是 spring boot。

以上是关于Spring-boot / Http call angular 2的角度没有'Access-Control-Allow-Origin' [重复]的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot之简单定时任务

Spring-Boot 之Thymeleaf

第二个spring-boot程序

在进行 HTTP 调用之前使用 RestTemplate 清除 Cookie

spring-boot 构建上传到nexus私服

(spring-boot) http 到 https 重定向,405 方法不允许消息