在尝试使用AJAX向我的Spring MVC控制器发出后续请求时,我遇到了传递cookie的问题。
例如我有一个/login
端点,我通过POST方法传递一些JSON,并设置cookie。我在萤火虫中看到了饼干:
正如你所看到的那样。我正在创建一个像这样的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标头中配置。
知道这里可能有什么问题吗?
答案 0 :(得分:1)
我找到了解决方案,因此我没有在方法级别上使用xhrFields: { withCredentials:true }
,而是将其设为全球:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
现在在后续请求中传递cookie。不知道为什么它不能在方法级别上工作,也许是jquery中的错误...
我使用的jQuery版本:2.1.3
也许这将有助于将来。