【问题标题】:Set cookies in cowboy properly在牛仔中正确设置 cookie
【发布时间】:2017-07-26 10:54:54
【问题描述】:

在牛仔中设置 cookie 非常简单 https://ninenines.eu/docs/en/cowboy/2.0/guide/cookies/

但是当我使用这种方法设置 cookie 时

init(Req0, Opts) ->     
    Method = cowboy_req:method(Req0),   
    {ok, Body0,    _} = cowboy_req:read_urlencoded_body(Req0), 
    {ok, RiakPid} = riakc_pb_socket:start("127.0.0.1", 8087), 
    Req = handle(Method,    Body0, Req0, RiakPid),     
    {ok, Body, _} = cowboy_req:read_body(Req),  
    erlang:display(Req), %    here I also check request    
    {ok,Req, Opts}.

% post
handle(<<"POST">>, Body, Req0, RiakPid) ->
    SessionID = "blablabla",
    Req = cowboy_req:set_resp_cookie(<<"token">>, SessionID, Req0),
    erlang:display(Req) %here I check request
    Req;

% get. Here I should successfully get token in cookies
handle(<<"GET">>, Body, Req0, RiakPid) ->   
    Cookies = cowboy_req:parse_cookies(Req0),   
    {_, Token} = lists:keyfind(<<"token">>, 1, Cookies), % here is when i fail to get    cookie by key     
    erlang:display(Token), 
    Req0;

并使用erlang:display(Req) 获取请求:

headers=>#{
<<"accept">>=><<"*/*">>
<<"accept-encoding">>=><<"gzip, deflate, br">>
<<"accept-language">>=><<"en-GB,en-US;q=0.8,en;q=0.6">>
<<"connection">>=><<"keep-alive">>
<<"content-length">>=><<"24">>
<<"content-type">>=><<"application/x-www-form-urlencoded">>
<<"cookie">>=><<"user=\"2|1:0|10:1487346656|4:user|4:Mw==|ba24da6f51c92ad05e278f218d15d2cda8ed9e7e3b800dcf39a244de5ecfff37\"">>
<<"host">>=><<"localhost:2939">>
<<"origin">>=><<"chrome-extension://eelcnbccaccipfolokglfhhmapdchbfg">>
<<"user-agent">>=><<"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36">>}
host=><<"localhost">>
host_info=>undefined,method=><<"POST">>
path=><<"/login">>
path_info=>undefined
peer=>{{127,0,0,1},53362}
pid=><0.4104.0>,port=>2939,qs=><<>>
ref=>my_http_listener
resp_cookies=>#{<<"token">>=>[<<"token">>,<<"=">>,"blablabla",<<"; Version=1">>,<<>>,<<>>,<<>>,<<>>,<<>>]}
scheme=><<"http">>,streamid=>1,version=>'HTTP/1.1'}

所以我是设置标题,而不是 cookie。

如何设置真正的cookies?

做人像

<<"cookie">>=>
<<"user=\"2|1:0|10:1487346656|4:user|4:Mw==|ba24da6f51c92ad05e278f218d15d2cda8ed9e7e3b800dcf39a244de5ecfff37\"">>
<<"token=\"blablabla\"">>

【问题讨论】:

  • 你的erlang:display(Req)中的resp_cookies=&gt;#{&lt;&lt;"token"&gt;&gt;=&gt;[&lt;&lt;"token"&gt;&gt;,&lt;&lt;"="&gt;&gt;,"blablabla",&lt;&lt;"; Version=1"&gt;&gt;,&lt;&lt;&gt;&gt;,&lt;&lt;&gt;&gt;,&lt;&lt;&gt;&gt;,&lt;&lt;&gt;&gt;,&lt;&lt;&gt;&gt;]}这行不是表明你正在设置那个cookie吗?
  • 据我了解,我设置了标题。而且当我做cowboy_req:parse_cookies(Req)时,我只得到&lt;&lt;"user=\"2|1:0|10:1487346656|4:user|4:Mw==|ba24da6f51c92ad05e278f218d15d2cda8ed9e7e3b800dcf39a244de5ecfff37\""&gt;&gt;
  • 我们能否提供一个完整的示例代码,用于设置 cookie 并尝试检索它?
  • 我编辑了一个问题来展示我的部分代码。不要关注Riak

标签: cookies erlang cowboy


【解决方案1】:

这是正确的代码

% post
handle(<<"POST">>, Body, Req0, RiakPid) ->
    SessionID = "blablabla",
    Req1 = cowboy_req:set_resp_cookie(<<"token">>, SessionID, Req0),
    erlang:display(Req1) %here I check request
    Req = cowboy_req:reply(200, Req1), % We should always pass correct Request
    Req;

重点是:当一个人使用 Request 时,他还应该注意 Request 及其状态。当您结束 Request (Req = cowboy_req:reply(200, Req1)) 时,您的 resp_cookies 记录将传递给 cookie。否则请求不完整

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 2013-06-06
    • 2017-02-01
    • 2020-09-28
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2014-04-01
    相关资源
    最近更新 更多