Cookie未在后续请求中传递

时间:2015-04-10 09:40:05

标签: java javascript ajax rest spring-mvc

在尝试使用AJAX向我的Spring MVC控制器发出后续请求时,我遇到了传递cookie的问题。

例如我有一个/login端点,我通过POST方法传递一些JSON,并设置cookie。我在萤火虫中看到了饼干:

enter image description here

正如你所看到的那样。我正在创建一个像这样的cookie:

NewCookie cookie = new NewCookie(new Cookie(SECURITY_TICKET, encodedTicket, configKey, null), null, (int) TimeUnit.MINUTES.toSeconds(expireTime), expireTimeDate, false, false)

并将其设置为HTTP标头:

httpHeaders.add(HttpHeaders.SET_COOKIE, cookie.toString());

然后将这些标题添加到ResponseEntity中,如下所示:

ResponseEntity entity = new ResponseEntity<>(this.entity, this.httpHeaders, this.status)

返回此响应实体。我的控制器的方法都是基于REST的。

那么我试图在成功登录之后调用另一个(/search)端点哪个功能期望cookie并且它显然失败,因为由于某种原因cookie没有被传回。

我的AJAX调用如下所示:

$(function () {
    $.ajax({
        url: 'http://localhost:8080/dev-citigroup-citi/login',
        type: 'POST',
        dataType: 'json',
        data: '{ "username": "client1", "password": "*******", "platform": "iOS", "UUID": "321321321", "application": "CitiReach", "applicationVersion": "1.0" }',
        success: function (data, status, xhr) {
            $.ajax({
                url: 'http://localhost:8080/dev-citigroup-citi/search/eventattendee?q=*:*&start=0&rows=1&wt=json&indent=true',
                type: 'GET',
                xhrFields: { withCredentials:true },
                success: function (data, status, xhr) {
                    console.log(data);
                },
                error: function (jqXHR) {
                    console.log(jqXHR);
                }
            });
        },
        error: function (jqXHR) {
            console.log(jqXHR);
        }
    });
});

正如我所提到的,/login可以,但另一个呼叫失败。我正在添加xhrFields: { withCredentials:true },其中应该包含/search请求中的Cookie,但出于某种原因,它不是。

我也正确设置了CORS:

Access-Control-Allow-Origin: http://localhost:63342
Access-Control-Allow-Credentials: true

http://localhost:63342是请求来源的起源,它在CORS标头中配置。

知道这里可能有什么问题吗?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案,因此我没有在方法级别上使用xhrFields: { withCredentials:true },而是将其设为全球:

    $.ajaxSetup({
        xhrFields: {
            withCredentials: true
        }
    });

现在在后续请求中传递cookie。不知道为什么它不能在方法级别上工作,也许是jquery中的错误...

我使用的jQuery版本:2.1.3

也许这将有助于将来。