HTTP的cookie處理

 什麼是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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章