目的:
用戶從php制作的web站點登錄后,有些時候要去瀏覽另一個由asp.net制作的站點,但還要用當前的登錄信息。
我們在php登錄時,把登錄信息等存儲在了$_session中,由于php的session是自己實現的,所以無法傳遞給asp.net。
那么如何讓asp.net站點知道用戶已經登錄了呢,從而把php登錄會話傳遞給asp.net呢,而且拿到登錄的一些參數呢?
當然我們可以直接傳遞參數,或者把session存儲在數據庫中,但是前者不安全,我希望這些事情在后臺完成,后者則有點麻煩。
那么有沒有什么簡單的辦法呢?
解決:
基本原理是:
asp.net頁面在page_load方法中,
    首先查看請求本站點的request的cookies,找到phpsessid,
        這就是標示當前訪問者的sessionid;
然后我們構造httpwebrequest,以這個phpsessionid向php站點下的checklogin.php頁面請求,
        看當前這個sessionid所代表的會話是否已經登錄。
如果登錄成功,那么該頁面將返回我們規定的一些數值,由asp.net鑒別即可。
 
更多詳情:
第一步,得到當前請求的web頁面的絕對路徑:
string strabsolutepath;
strabsolutepath = request.url.absoluteuri;
int npos = strabsolutepath.lastindexof("/");
int nremovelength = strabsolutepath.length - npos;
string struripath = strabsolutepath.remove(npos, nremovelength);
第二步,遍歷cookie,尋找phpsessionid:
string strphpsessionid = "";
for(int i=0;i < request.cookies.count;i++)
{
if("phpsessid" == request.cookies[i].name)
{
strphpsessionid = "phpsessid=" + request.cookies[i].value;
}
}
第三步,通過validatelogin模擬httpwebrequest帶著phpsessionid請求驗證頁面,看當前用戶是否登錄:
validatelogin vllogin = new validatelogin(
struripath,
"/../mainsite/checklogin.php",
strphpsessionid);
m_strlogininfo = vllogin.logininfo.trim();
我們給system.web.httpwebrequest 對象創建一個新的cookiecontainer,把phpsessionid放進去,如下所示:
cookiecontainer cookiecon = new cookiecontainer();
hwrrequest.cookiecontainer = cookiecon;
hwrrequest.cookiecontainer.setcookies(new uri(strvalidatepageurl),
m_strphpsessionid);
m_strphpsessionid是這樣構造的:
phpsessid=.....
。
這樣,asp.net發起的請求被主站點的php頁面接收到之后,就會認為是同一個登錄會話。
validatelogin.cs的代碼如附錄所示:
using system;
using system.web;
using system.io;
using system.net;
using system.text;
namespace linktone.mysite.components
{
/// <summary>
/// validatelogin 的摘要說明:由于要集成到php制作的mainsite站點中,
/// 首要就是登錄統一。
/// 那么我們用這類來保證瀏覽本站點的用戶已經先登錄了mainsite站點;
/// 我們的基本原理是:
/// 首先查看請求本站點的request的cookies,找到phpsessid,這就是標示當前訪問者的sessionid;
/// 然后我們構造httprequest,以這個phpsessionid向mainsite站點下的checklogin.php請求,
/// 看當前這個sessionid所代表的會話是否已經登錄;
/// 如果登錄成功,那么該頁面將返回一個字符串:“blablabla”.
/// </summary>
///
/// 作者:鄭昀@掌上靈通 20050221
public class validatelogin
{
/// 要請求的驗證頁面的相對路徑
private string m_strvalidatepagerelateurl;
/// 從請求端傳遞過來的phpsessionid
private string m_strphpsessionid;
protected string m_strlasterror;
private webresponse m_webresponse;
public string validatepage
{
get { return m_strvalidatepagerelateurl; }
set { m_strvalidatepagerelateurl = value; }
}
public string loginoperatorid
{
get { return m_strloginoperatorid; }
set { m_strloginoperatorid = value; }
}
/// <summary>
///
/// </summary>
/// <param name="absoluteuri">當前web頁面請求的絕對url</param>
/// <param name="validatepage">要請求的驗證頁面的相對路徑</param>
public validatelogin(string absoluteuri,
string validatepage,
string phpsessionid)
{
m_strvalidatepagerelateurl = validatepage;
m_strphpsessionid = phpsessionid;
/// 請求頁面
requestgetoperatorid(absoluteuri);
}
~validatelogin()
{
m_webresponse.close();
}
public void requestgetoperatorid(string strabsoluteuri)
{
try
{
string path;
path = strabsoluteuri;
/// 構建要訪問的絕對路徑
string strvalidatepageurl = path + m_strvalidatepagerelateurl;
/// 構建請求的httpwebrequest對象,并設置好session
httpwebrequest hwrrequest = (httpwebrequest)webrequest.create(
strvalidatepageurl);
hwrrequest.method = "get";
hwrrequest.proxy = system.net.webproxy.getdefaultproxy();
// allow auto redirects from redirect headers
hwrrequest.allowautoredirect=true;
// 30 second timeout for request
hwrrequest.timeout=(int) new timespan(0,0,60).totalmilliseconds;
// give the crawler a name.
hwrrequest.useragent = "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1)";
hwrrequest.contenttype = "application/x-www-form-urlencoded";
cookiecontainer cookiecon = new cookiecontainer();
hwrrequest.cookiecontainer = cookiecon;
hwrrequest.cookiecontainer.setcookies(new uri(strvalidatepageurl),
m_strphpsessionid);
hwrrequest.keepalive = false;
hwrrequest.protocolversion = httpversion.version10;
/// webrequest 實例上的 getresponse 方法
/// 將來自客戶端應用程序的請求發送到在 uri 中標識的服務器。
m_webresponse = hwrrequest.getresponse();
/// getresponse 和 endgetresponse 方法返回一個 webresponse 實例,
/// 該實例提供對服務器返回的數據的訪問。
/// 因為此數據由 getresponsestream 方法作為流提供給發出請求的應用程序,
/// 所以它可以在應用程序中的使用數據流的任何地方使用。
streamreader sr = new streamreader(
m_webresponse.getresponsestream(),
encoding.getencoding("gb2312"));
string svalidate = sr.readtoend();
sr.close();
/// 檢驗驗證登陸的頁面是否確認登陸了,否則直接引導到login.php頁面
/// 調用者負責重定向
/// m_strloginoperatorid = blabla;
}
catch (exception eexcep)
{
m_strlasterror = eexcep.message;
}
return;
}
}
}
 
新聞熱點
疑難解答
圖片精選