在 javascript 中的 HTTP POST 请求中发送 cookie

Posted

技术标签:

【中文标题】在 javascript 中的 HTTP POST 请求中发送 cookie【英文标题】:Send cookie in HTTP POST Request in javascript 【发布时间】:2016-06-14 11:23:32 【问题描述】:

我正在尝试通过 javascript 向服务器(这是一个 REST 服务)发出 POST 请求,并且在我的请求中我想发送一个 cookie。我下面的代码不起作用,因为我无法接收 cookie在服务器端。下面是我的客户端和服务器端代码。

客户端:

var client = new XMLHttpRequest();
          var request_data=JSON.stringify(data);
var endPoint="http://localhost:8080/pcap";
var cookie="session=abc";
          client.open("POST", endPoint, false);//This Post will become put 
          client.setRequestHeader("Accept", "application/json");
          client.setRequestHeader("Content-Type","application/json");

          client.setRequestHeader("Set-Cookie","session=abc");
          client.setRequestHeader("Cookie",cookie);
          client.send(request_data);

服务器端:

public @ResponseBody ResponseEntity getPcap(HttpServletRequest request,@RequestBody PcapParameters pcap_params )

Cookie cookies[]=request.getCookies();//Its coming as NULL
        String cook=request.getHeader("Cookie");//Its coming as NULL

【问题讨论】:

setRequestHeader("Set-Cookie","session=abc"); — Set-Cookie 是 response 标头,而不是请求标头。 另见此线程***.com/questions/2870371/… 【参考方案1】:

见the documentation:

如果标头与以下标头之一不区分大小写,则终止这些步骤……Cookie

您不能使用 XHR 显式设置 Cookie 标头。


看起来您正在发出跨域请求(您使用的是绝对 URI)。

您可以设置withCredentials 以包含cookie。

当跨域请求中包含用户凭据时为真。当它们要在跨域请求中被排除以及在其响应中要忽略 cookie 时为 False。最初是错误的。

这样的:

client.withCredentials = true;

这只有在http://localhost:8080 使用一种受支持的方法(例如在 HTTP Set-Cookie response 标头中)设置了 cookie 时才有效。


否则,您将不得不对想要放入 cookie 中的数据进行编码。

【讨论】:

我的代码应该是 client.setRequestHeader("Set-Cookie","session=abc"); client.withCredentials = true;并添加跨源(我的服务器端已经有跨源)服务器:@CrossOrigin(origins="*") @RequestMapping(value = URIConstansts.PCAP,produces = "application/json",method = RequestMethod. POST) public @ResponseBody ResponseEntity getPcap(HttpServletRequest request,@RequestBody PcapParameters pcap_params ) client.setRequestHeader("Set-Cookie","session=abc"); — 不,这是响应标头。 client.withCredentials = true; — 是的,如果您的服务器要通过可接受的机制(例如 Set-Cookie HTTP 响应标头)设置 cookie。 我正在向服务器发送 cookie。我的服务器不会设置任何 cookie。它只会接收它。所以服务器端不会设置 cookie,它只会从javascript。客户端(javascript)正在向服务器发送 POST 请求。服务器没有向客户端发送任何内容。只是 httpstatus 为 200 那么你不能为此使用cookies。正如我所说,您不能在跨域 XHR 请求上设置 cookie 客户端。【参考方案2】:

这也可以用更现代的fetch来完成

fetch(url, 
    method: 'POST',
    credentials: 'include'
    //other options
).then(response => console.log("Response status: ", response.status));

【讨论】:

没有。 fetch XHR 都让您告诉浏览器发送它为请求中的 URL 存储的任何 cookie,但这个问题是关于 手动 添加 cookie使用 JavaScript。

以上是关于在 javascript 中的 HTTP POST 请求中发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Java 或 JavaScript 中发出 HTTP (POST) 请求而无需等待响应

使用 Javascript 发出 HTTP POST 身份验证基本请求

javascript 接收HTTP POST

javascript nodejs http get和post请求

Javascript:调用阻塞的 HTTP POST [重复]

javascript注入$http post方法不起作用