HTTP的cookie處理

來源:互聯網
上載者:User

 什麼是Session, 什麼是Cookie?

Session是由應用伺服器維持的一個伺服器端的儲存空間,使用者在串連伺服器時,會由伺服器產生一個唯一的SessionID,用該SessionID為標識符來存取伺服器端的Session儲存空間。而SessionID這一資料則是儲存到用戶端,用Cookie儲存的,使用者提交頁面時,會將這一SessionID提交到伺服器端,來存取Session資料。這一過程,是不用開發人員幹預的。所以一旦用戶端禁用Cookie,那麼Session也會失效。

Cookie是用戶端的儲存空間,由瀏覽器來維持。

可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進位的字串,是SessionID的值。

    實質上 URL 重寫是通過向 URL 串連添加參數,並把 session ID 作為值包含在串連中。然而,為使這生效,你需要為你的 servlet 響應部分的每個串連添加 session ID.

Wap中如何進行Session管理?

Wap與PC不同之處在與Wap1.x不支援Session與Cookie,Wap2.0雖然支援但是只有協議支援還是不行,還要看手機終端支不支援?所以我們的解決方案就是完全不依賴Wap協議,完全不依賴手機終端,使用Url重寫進行Session的維護,這個方法只與伺服器端有關.

2.6.2     COOKIE規範  
  1. COOKIE一般情況下存放在使用者的手機上,若使用者手機不支援COOKIE功能,則WAP網關將協助儲存使用者COOKIE資訊;  
  2. COOKIE可分為永久性COOKIE和暫時性COOKIE,通過手機與WAP網關的配合,兩種COOKIE均可實現,可根據業務的需求選擇使用;  
  3. 暫時性COOKIE的儲存時間一般是1小時,可根據業務的需要自行指定;  
  4. 在遊戲、社區類業務中,涉及使用者身份識別的資訊應使用永久性COOKIE;  
   
                                                                          ------移動夢網WAP業務規範(V2.0)  
hdr.SetFieldL(iSession.StringPool().StringF(HTTP::ECookie,
RHTTPSession::GetTable()), iCookieData);

讀取cookiess 2rd
------------------------- read and save cookie from HTTP response HEADER ------------------

RHTTPHeaders aCurrentHeader;
aCurrentHeader = aResponse.GetHeaderCollection();

// 2. ------- set the RStringF string to get header field data --//

RStringF setcookie = iSession.StringPool().StringF(HTTP::ESetCookie,
RHTTPSession::GetTable());

// 3. ------- get the cookie raw data ---------------------------//

TInt ifcookie = aCurrentHeader.GetField(setcookie,0,iCookieData); //( THTTPHdrVal iCookieData;)

 

--------------------------
添加cookies

void CHTTPEngine::AddCookie(RHTTPHeaders aHeaders)
{
if(iCookie_name.Length() >0 && iCookie_value.Length() > 0)
{
RStringPool string_pool = iSession.StringPool();
RStringF cookie_rsf = string_pool.StringF(HTTP::ECookie,RHTTPSession::GetTable());
THTTPHdrVal field_value;
field_value.SetStrF (cookie_rsf);
aHeaders.SetFieldL(cookie_rsf, field_value);

THTTPHdrVal cookie_hdr;
RStringF cookie_name_rsf = string_pool.StringF(HTTP::ECookieName,RHTTPSession::GetTable());
RStringF name = string_pool.OpenFStringL (iCookie_name);
cookie_hdr.SetStrF (name);
aHeaders.SetParamL (cookie_rsf, cookie_name_rsf, cookie_hdr, 0);
name.Close();

RStringF cookie_value_rsf = string_pool.StringF(HTTP::ECookieValue,RHTTPSession::GetTable());
RStringF value = string_pool.OpenFStringL (iCookie_value);
cookie_hdr.SetStrF (value);
aHeaders.SetParamL (cookie_rsf, cookie_value_rsf, cookie_hdr, 0);
value.Close();
}
}

這段代碼在第二版本中可以用

---------------------------------------------
問題已經解決
主要是字元格式設定問題

RStringF name = string_pool.OpenFStringL (iCookie_name);
cookie_hdr.SetStrF (name);
改成
RString name = string_pool.OpenStringL (iCookie_name);
cookie_hdr.SetStr (name);

下面的就可以通過了:

if(iCookie_name.Length() >0 && iCookie_value.Length() > 0)
{
RStringPool string_pool = iSession.StringPool();
RStringF cookie_rsf = string_pool.StringF(HTTP::ECookie,RHTTPSession::GetTable());
THTTPHdrVal field_value;
field_value.SetStrF (cookie_rsf);
aHeaders.SetFieldL(cookie_rsf, field_value);

THTTPHdrVal cookie_hdr;
RStringF cookie_name_rsf = string_pool.StringF(HTTP::ECookieName,RHTTPSession::GetTable());
RString name = string_pool.OpenStringL (iCookie_name);
cookie_hdr.SetStr (name);
aHeaders.SetParamL (cookie_rsf, cookie_name_rsf, cookie_hdr, 0);
name.Close();

RStringF cookie_value_rsf = string_pool.StringF(HTTP::ECookieValue,RHTTPSession::GetTable());
RString value = string_pool.OpenStringL (iCookie_value);
cookie_hdr.SetStr (value);
aHeaders.SetParamL (cookie_rsf, cookie_value_rsf, cookie_hdr, 0);
value.Close();

}
---------------------------------------------------

It's ok for 3rd.

void WriteCookie(RHTTPHeaders headers,TBuf<KMaxHeaderNameLen> _my_cookie_name,TBuf<KMaxHeaderValueLen> _my_cookie_value)
{

TBuf8<KMaxHeaderNameLen> my_cookie_name;
TBuf8<KMaxHeaderValueLen> my_cookie_value;

my_cookie_name.Copy(_my_cookie_name);
my_cookie_value.Copy(_my_cookie_value);
RStringPool string_pool = iSession.StringPool();

RStringF cookie_rsf = string_pool.StringF(HTTP::ECookie,RHTTPSession::GetTable());
THTTPHdrVal field_value;
field_value.SetStrF (cookie_rsf);
headers.SetFieldL(cookie_rsf, field_value);

THTTPHdrVal cookie_hdr;
RStringF cookie_name_rsf = string_pool.StringF(HTTP::ECookieName,RHTTPSession::GetTable());

RString name = string_pool.OpenStringL (my_cookie_name);
cookie_hdr.SetStr (name);
headers.SetParamL (cookie_rsf, cookie_name_rsf, cookie_hdr, 0);
name.Close();
RStringF cookie_value_rsf = string_pool.StringF(HTTP::ECookieValue,RHTTPSession::GetTable());
RString value = string_pool.OpenStringL (my_cookie_value);
cookie_hdr.SetStr (value);
headers.SetParamL (cookie_rsf, cookie_value_rsf, cookie_hdr, 0);
value.Close();
my_cookie_name.Zero();
my_cookie_value.Zero();

}

----------------------------
第二版中可用
To read a single cookie name and value from incoming headers:

HBufC8* my_cookie_name;
HBufC8* my_cookie_value;

RHTTPResponse resp = aTransaction.Response();
RHTTPHeaders headers = resp.GetHeaderCollection();
RStringPool string_pool = iSession.StringPool();

{
RStringF set_cookie_rsf = string_pool.StringF(HTTP::ESetCookie, RHTTPSession::GetTable());
THTTPHdrVal field_value;
if (headers.GetField(set_cookie_rsf, 0, field_value) == KErrNone)
{
RStringF cookie_rsf = string_pool.StringF(HTTP::ECookie, RHTTPSession::GetTable());

if (field_value.StrF() == cookie_rsf)
{
RStringF cookie_value_rsf = string_pool.StringF(HTTP::ECookieValue, RHTTPSession::GetTable());
RStringF cookie_name_rsf = string_pool.StringF(HTTP::ECookieName, RHTTPSession::GetTable());
THTTPHdrVal cookie_hdr;
if (!headers.GetParam(set_cookie_rsf, cookie_value_rsf, cookie_hdr))
{
RStringF rsf = string_pool.StringF(cookie_hdr.StrF());
my_cookie_value = rsf.DesC().AllocL();
}
if (!headers.GetParam(set_cookie_rsf, cookie_name_rsf, cookie_hdr))
{
RStringF rsf = string_pool.StringF(cookie_hdr.StrF());
my_cookie_name = rsf.DesC().AllocL();
}
}
}
}

 

To write a single cookie name and parameter into outgoing headers:

RStringPool string_pool = iSession.StringPool();

RStringF cookie_rsf = string_pool.StringF(HTTP::ECookie,RHTTPSession::GetTable());
THTTPHdrVal field_value;
field_value.SetStrF (cookie_rsf);
headers.SetFieldL(cookie_rsf, field_value);

THTTPHdrVal cookie_hdr;
RStringF cookie_name_rsf = string_pool.StringF(HTTP::ECookieName,RHTTPSession::GetTable());
RStringF name = string_pool.OpenFStringL (*my_cookie_name);
cookie_hdr.SetStrF (name);
headers.SetParamL (cookie_rsf, cookie_name_rsf, cookie_hdr, 0);

RStringF cookie_value_rsf = string_pool.StringF(HTTP::ECookieValue,RHTTPSession::GetTable());
RStringF value = string_pool.OpenFStringL (*my_cookie_value);
cookie_hdr.SetStrF (value);
headers.SetParamL (cookie_rsf, cookie_value_rsf, cookie_hdr, 0);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.