跨域不适用于 Spring Boot

Posted

技术标签:

【中文标题】跨域不适用于 Spring Boot【英文标题】:Cross-orgin doesn't work with Spring boot 【发布时间】:2018-07-04 02:03:26 【问题描述】:

我已经使用 spring-boot 和 angular5 构建了一个简单的应用程序,我为没有 spring-security 的 Controller 启用了跨域,该应用程序运行良好,但是当我只是 spring-security 跨域的依赖项时没有不工作,那我该怎么办?

控制器

   @RestController
   @RequestMapping(ResourceConstants.Product_URL)
   @Api(description = "Porduct and Categories resources")
   @CrossOrigin
   public class ProductResources 

    @Autowired
    private CategoryRepo cateRepo;



    // Categories Resources
    @RequestMapping(method = RequestMethod.GET, value = "/AllCategories")
    @ApiOperation(value = "Return All Categories")
    public List<Category> getAllCategories() 

        return cateRepo.findAll();// .stream().
        // filter((c)->c.getActive()==1)
        // .collect(Collectors.toList());
    

我的 Angular 5 代码

import  Component, OnInit  from '@angular/core';
import  CategoryService  from '../services/category.service';


import Http, Response from "@angular/http";
import  Observable  from 'rxjs/Observable';
import "rxjs/add/operator/map";
import "rxjs/add/operator/catch";

@Component(
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss'],
  providers: [CategoryService]
)

export class HeaderComponent implements OnInit 

  currency = [];
  languages = [];
  links = [];
  constructor(private http: Http) 

    this.currency = ['USD', 'Egp'];
    this.languages = [
      'Arabic',
      'English'
    ];
    this.links = ['SignUp', 'Profile', 'Settings', 'SignIn'];

  

  ngOnInit() 

console.log("Welcome");
    this.getAll()
            .subscribe(
            data => console.log(data),
            err => 
                // Log errors if any
                console.log(err);
            );
  

  getAll(): Observable<any> 


    //noinspection TypeScriptValidateTypes
    return this.http
        .get('http://localhost:8080/rest/api/product/AllCategories')
        .map(this.mapRoom);


mapRoom(response: Response): any[] 
    return response.json().content;




在 google chrome 上运行 angular 5 时出现此错误

GET http://localhost:8080/rest/api/product/AllCategories 401 ()

 Failed to load http://localhost:8080/rest/api/product/AllCategories: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401.

我应该添加什么?

【问题讨论】:

您如何为您的 Angular 5 应用程序提供服务?您需要 Angular 5 的 CORS 以允许 localhost:8080 【参考方案1】:

由于您在添加 spring-security 之前已经使用它,我假设您已经在 Angular 5 中设置了代理以访问后端(因为它们位于不同的端口上)。

为了让 CORS 与 Spring Security 一起使用,您需要以这种方式配置 CorsConfigurationSource bean:

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

这只是基本配置,您还可以使用 CorsConfiguration 类中的 setAllowedOrigins 和 setAllowedMethods 方法更具体地指定允许的方法/来源。

有关此的春季文档:https://docs.spring.io/spring-security/site/docs/current/reference/html/cors.html

【讨论】:

以上是关于跨域不适用于 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Security 核心和 CORS 插件的 grails REST API 不适用于 OPTIONS http 方法请求

我的回调不适用于跨域的 json 数据

跨域不适用于 ios phonegap

跨域 ajax 不适用于移动 Safari 中的重定向

spring bootspring security

Spring BootSpring Security登陆异常出路