在 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 nodejs http get和post请求