当前位置: 首页 > 知识库问答 >
问题:

在AWS lambda Node JS的超文本传输协议响应标头中设置Cookie

骆嘉石
2023-03-14

我启用了 Lambda 代理集成,并将响应标头设置为 Lambda 输出和 API 网关的一部分,这些网关会将其作为 HTTP 响应的一部分返回给客户端。

示例代码:

callback(null, {
    "statusCode": 302,
    "Location" : "https://somewebsite.com"
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
});

我需要在标题中发送3个cookie。我试过了。但是失败了:

callback(null, {
    "statusCode": 302,
    "Location" : "https://somewebsite.com"
    "headers": { "Set-Cookie": [cookie1String, cookie2String, cookie3String] },
    "body": "..."
});

[编辑]我连接了cookie并作为响应传入,客户端获得了cookie。但是当客户端在“位置”中调用目标时,请求的标头中没有cookie。

callback(null, {
    "statusCode": 302,
    "Location" : "https://somewebsite.com"
    "headers": { "Set-Cookie": c1=cookie1String;c2=cookie2String; c3=cookie3String] },
    "body": "..."
});

请帮助将这3个cookie发送给我的客户。

共有3个答案

商同
2023-03-14

我想说,您的问题与回调中的响应对象没有按照api网关期望的方式格式化有关。

这些链接专门引用了 aws 文档。

http://docs . AWS . Amazon . com/API gateway/latest/developer guide/handle-errors-in-lambda-integration . html

您的代码出现问题。。。

    < li >“位置”看起来不像是有效的属性 < li >使用JSON.stringify之类的方法确保您的标题键/值对是实际的JSON对象

不要忘记为api网关和lambda启用包含完整请求和响应的日志。这两个日志将帮助您调试。

督翰学
2023-03-14

API网关不允许您多次映射同一个标头。我通过使用不同的大小写来设置cookie方法。

callback(null, {
    "statusCode": 302,
    "Location" : "https://somewebsite.com"
    "headers": { "Set-Cookie": cookie1, "set-Cookie": cookie2 },
    "body": "..."
});
皇甫波峻
2023-03-14

使用multiValueHeaders代替标头

    const response = {
        isBase64Encoded: true,
        statusCode: 200,
        multiValueHeaders : {"Set-Cookie": [`language=${language}`, `theme=${theme}`]},
        body: JSON.stringify('User profile set successfully')
    };
    callback(null, response);

如果你需要它更聪明,考虑一下

function createHeaders(headers) {
  const defaultHeaders = {
    'Access-Control-Allow-Origin': '*',
  };
  const allHeaders = Object.assign({}, defaultHeaders, headers);
  const singleValueHeaders = {};
  const multiValueHeaders = {};
  Object.entries(allHeaders).forEach(([key, value]) => {
    const targetHeaders = Array.isArray(value) ? multiValueHeaders : singleValueHeaders;
    Object.assign(targetHeaders, { [key]: value });
  });

  return {
    headers: singleValueHeaders,
    multiValueHeaders,
  };
}

然后在回调函数中使用它。

callback(null, {
  statusCode: status || 200,
  body: JSON.stringify(body),
  ...createHeaders({ 'Set-Cookie': cookie }),
});
 类似资料:
  • 我正在努力学习一些关于HTTP的基础知识。我检查了一些HTTP响应头,注意到了两件让我困惑的事情: > 没有缓存控制标头,并且 ETag标头存在。 我理解 ETag 的方式是,客户端将 ETag 中的请求发送到缓存,并且缓存将资源 Etag 与服务器重新验证。但是,如果没有缓存控制标头作为响应,则所有后续请求都直接与服务器进行重新验证并完全省略缓存。是这种情况还是我错过了什么?当响应中不存在缓存控

  • 我只是有一个关于服务中http请求的结构和处理响应的问题。我正在使用Angular2。alpha46 Typescript(刚刚开始测试-我喜欢它…Ps…。感谢所有一直致力于它并通过github作出贡献的人) 因此,采取以下措施: 登录表单。组成部分ts 从这个组件中,我导入了我的userService,它将容纳我的超文本传输协议请求,以登录用户。 使用者服务ts 我想做的是能够处理http请求之

  • 我的LogCat: 签名密钥(sw)为https://api.dropbox.com/1/shares/dropbox/a.jpg?oauth_consumer_key=2f2y1dyuqhp58ek 我对http没有太多经验。。 因为httpPost=新的httpPost(sw);工作正常,这是否意味着基本字符串签名正确? 还是我错过了什么?

  • 我正在使用下面的代码登录apiendpoint并从中检索数据,但响应似乎已编码,我无法读取内容。我正在使用request-requestes-0.0.1 当我在控制台上打印相同的响应 有人能告诉我如何解码和读取响应中的数据吗

  • 我想知道你对这个概念的看法/意见。如果有替代方案?这是否可行/有益? 据我所知,对于每个http请求,服务器都会执行一些操作并返回http响应。 现在考虑任何场景,我们希望对服务器上运行的进程有更多的控制。 情景1:http请求发送- 在这里,资源被浪费了。 情况2:http请求发送- 在这里,客户端不知道服务器中运行的进程的状态。客户端必须等待,直到它获得超文本传输协议响应。 我的想法是:在初始

  • 我可以通过api网关集成响应头映射设置单个http响应头 在这种情况下,我给出了来自aws lambda的响应,并使用regex(“.http.”)识别响应并最终将其映射到我的标题,如下所示 当我试图一次映射一个标题时,这就起作用了 但是我想在一个响应中同时设置位置和Cookie头。为了实现这一点,我从aws lambda-like返回了一个json 但是我不能通过和 通过使用而不是。但这不是检查