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