如何发出跨域请求并发送带有请求的cookie

时间:2018-01-31 10:45:10

标签: spring angular http cookies tomcat8

我正在为后端和前端(spring mvc和angular4)开发2个应用程序,我使用http端口(8080)和我的前端使用http端口(4200)在tomcat服务器上托管spring应用程序,两个应用程序之间是使用json。 使用会话cookie识别用户。

问题是我遇到了跨域问题,因为我为这两个应用程序使用了不同的端口,当我发出http post请求时,cookie不会发送。

我发现的唯一解决方案: 当我将角度应用程序放在我的spring项目的/ src / main / webapp中时,在this documentation之后,我没有问题并且cookie被自动设置但是每次执行前面的步骤都很痛苦当我想测试一些东西时。

我还想到了在开发过程中像jsonp这样的一些解决方法,但是我认为这不会很有效,以后我需要执行一些e2e测试。

有没有人有关于如何制作这个跨域的想法/示例...

2 个答案:

答案 0 :(得分:0)

可以通过代理建立通信。

"start": "ng serve --proxy-config proxy.config.json"中添加package.json "scripts"

proxy.config.json添加:

{
    "/api/*": {
        "target": "http://server.com:8080",
        "secure": false,
        "logLevel": "debug"
    }
}

答案 1 :(得分:0)

所以经过一些研究后我得出了这个解决方案: 在我的后端服务的安全性和可扩展性方面,最好的方法是使用CROS,任何其他解决方案,如JSONP,代理只是一种解决方法,这将不会带来任何因为同源政策所遵循通过浏览器

遵循this documentation将要发生的情况: 1)浏览器将发送一个OPTIONAL请求 2)服务器将以允许的来源进行响应 3)如果我们的域(在我的情况下是前端域/角度应用程序)被验证,cookie将自动发送到另一个请求

我所做的实施: 在春季应用程序:

//Some logic before this
if ("OPTIONS".equals(request.getMethod())) {
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
        response.setHeader("Access-Control-Allow-Credentials","true");
        response.setHeader("Access-Control-Allow-Methods","POST");
        response.setHeader("Access-Control-Allow-Headers","Content-Type");

        response.setStatus(HttpServletResponse.SC_OK);
        ((HttpServletResponse) servletResponse).setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
        return ;
    }
// some logic after this

在前端应用中,我们可以使用xhr发送请求,如附带链接中所述。