RESTful API是否需要随时进行CORS实施?

时间:2016-12-23 13:55:34

标签: rest api angular cors

我在客户端 - 服务器项目中努力实现CORS。 CORS表示只有在头部包含CORS值时才允许来自其他源(例如其他域)的调用。

所以,例如,如果我在www.domain.com上托管一个网站并在同一个域上调用RESTful API,那么一切都很好。

但是,如果我为移动应用程序开发API,则移动设备不具有相同的API域。怎么能一起工作?我的服务中每次都需要CORS实现吗?

问题出现了,因为我开发了一个Angular 2应用程序,它运行在localhost:4200上的dev中,我的API运行在localhost:8080(使用Spring Boot构建)。所以客户端抛出一个异常,因为它不是同一个来源(不同的端口)。

目标是在互联网上的某个根服务器上托管我的API,在不同的网站空间提供商上托管客户端(因为它只是一个页面应用程序)。 api与http://1.2.3.4:8080/api/v1和客户端http://www.example.com:80/myPage

一起运行

那么,我是否需要每次都实现Cross-Origin?还是有另一种方法可以实现吗?

2 个答案:

答案 0 :(得分:3)

出于安全考虑,浏览器强制执行同源策略,即,在网页中运行的脚本(通常是AJAX调用)不能访问驻留在不同域中的另一页面的数据。在某些情况下,这可能是限制性的。 CORS(跨源资源共享)是大多数现代浏览器支持的W3C规范,用于指定何时允许跨源请求是安全的。

在Spring启动时,启用CORS就像adding the @CrossOrigin annotation一样简单。可以在方法级别添加此批注,以便仅针对特定请求映射或在类级别为整个控制器启用。

您可以通过添加"来源"列出要允许的域和端口。属性到注释。如果未指定,则默认情况下允许所有原点(出于安全原因,最好避免这种情况)。

以下是在控制器级别为example.com域和端口80启用CORS的示例

@CrossOrigin(origins = "http://www.example.com:80")
@RestController
@RequestMapping("/yourmapping")
public class YourController {

}

答案 1 :(得分:2)

是的,如果您正在开发API并希望将其公开并希望移动用户或其他网站的消费者使用它,则应始终为任何网站(*)设置CORS。在这里你可以阅读更多信息:

https://spring.io/understanding/CORS