在我們產品既有的程式中,有一段程式碼會去取得Client端的IP,主要用途是與ID一起作為識別使用者之用,因為為了方便使用者使用,我們的系統是允許不同使用者使用相同的帳號登入的,因此我們多加了IP這個key作為識別兩個同樣帳號的使用者,而以前程式的寫法是這樣:
1 string tClientIP = Request.ServerVariables["REMOTE_ADDR"].ToString();
過去在使用時都沒有遇到什麼問題,結果在近期卻發生在不同電腦上使用的兩個使用者,系統記錄到的IP竟然是相同的,這也導致兩個使用相同ID登入的使用者,彼此之間的使用者資訊會互相覆蓋,真是個大問題,上網查了一下發現,如果client端有設定代理伺服器的話,Request.ServerVariables["REMOTE_ADDR"]取到的會是代理伺服器的IP,這時候我們可以透過以下的程式判斷是否有代理伺服器:
1 Request.ServerVariables["HTTP_VIA"].ToString();
有設定代理伺服器的話,我們可以透過以下的語法取得Client真正的IP:
1 Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
如果沒有設定代理伺服器的話以上兩個內容值是空白的,以上資訊參考自:http://neural.cs.nthu.edu.tw/jang/books/webprog/06asp/request.asp?SessionCount=4
string clientIP = GetClientIP();
////// 取得正確的Client端IP /// ///protected string GetClientIP() { //判所client端是否有設定代理伺服器 if (Request.ServerVariables["HTTP_VIA"] == null) return Request.ServerVariables["REMOTE_ADDR"].ToString(); else return Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); }
private static string RetrieveIP(HttpRequest request) { string ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (ip == null || ip.Trim() == string.Empty) { ip = request.ServerVariables["REMOTE_ADDR"]; } return ip; }
沒有留言:
張貼留言