新人求教PHPThink 關於session和cookie的問題

來源:互聯網
上載者:User
WPF(C#)開發的用戶端,想要實現開啟瀏覽器並登入網站的功能。參考了這個 http://blog.csdn.net/htsnoopy/article/details/7094224
我通過c#代碼產生了一個cookie,但是開啟瀏覽器跳轉網頁的時候發現session裡面的值是空的。
仔細研究了一下才發現,PHPThink架構開發的網站每次都會產生固定的sessionid,而My Code每次產生的sessionid都是隨機的,對不上號所以也就登入不了,怎麼辦呢?


回複討論(解決方案)

sessionid 是服務端產生的,用戶端只能讀取
不然如何能溝通呢?

sessionid 是服務端產生的,用戶端只能讀取
不然如何能溝通呢? 嗯 這個我知道 服務端也在本地 我不知道該怎麼設定才能讓他們一致啊

sessionid 是服務端產生的,用戶端只能讀取
不然如何能溝通呢? 伺服器是用wamp搭建的

你在用戶端讀呀!
你給的連結裡不是有讀取 cookie 的部分嗎?

還要把讀到的 cookie 發回去,他也應該是有的

你在用戶端讀呀!
你給的連結裡不是有讀取 cookie 的部分嗎? 讀到了,也發回去了,但是最後開啟網頁的時候,他又重建了一個session,這個sessionid和我發的不一樣,而且無論怎麼弄她都是固定的id

那你的 php 部分是怎麼寫的?
如果“無論怎麼弄她都是固定的id”,那你讀到的和發回去的不也是那個固定的id嗎?

那你的 php 部分是怎麼寫的?
如果“無論怎麼弄她都是固定的id”,那你讀到的和發回去的不也是那個固定的id嗎? 不是哦 什麼原因呢?

你還是貼代碼吧!

C#擷取cookie登入部分

            HttpHeader header = new HttpHeader();            header.accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";            header.contentType = "application/x-www-form-urlencoded";            header.method = "POST";            header.userAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E";            header.maxTry = 200;            CookieCollection mycookie = HTMLHelper.GetCookieCollection("http://localhost/gyjw/index.php/index/login_into",                    "admin=admin&password=424", header);            foreach (Cookie cookie in mycookie) //將cookie設定為瀏覽的cookie              {                InternetSetCookie(                    "http://" + cookie.Domain.ToString(),                    cookie.Name.ToString(),                    cookie.Value.ToString() + ";expires=Sun,22-Feb-2099 00:00:00 GMT");            }            //System.Diagnostics.Process.Start("http://localhost/gyjw/index.php/index/Login.html");            //System.Diagnostics.Process.Start("http://localhost/gyjw/index.php/index/login_into");            //System.Diagnostics.Process.Start("http://localhost/gyjw/index.php");            System.Diagnostics.Process.Start("http://localhost/gyjw/index.php/user/AddUser.html");

httphelper類

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;using System.Threading;namespace WpfUI{    public class HTMLHelper    {       ///         /// 擷取CooKie       ///        ///        ///        ///        ///        public static CookieContainer GetCooKie(string loginUrl, string postdata, HttpHeader header)       {           HttpWebRequest request = null;           HttpWebResponse response = null;           try           {               CookieContainer cc = new CookieContainer();               request = (HttpWebRequest)WebRequest.Create(loginUrl);               request.Method = header.method;               request.ContentType = header.contentType;               byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);               request.ContentLength = postdatabyte.Length;               request.AllowAutoRedirect = false;               request.CookieContainer = cc;               request.KeepAlive = true;               //提交請求               Stream stream;               stream = request.GetRequestStream();               stream.Write(postdatabyte, 0, postdatabyte.Length);               stream.Close();               //接收響應               response = (HttpWebResponse)request.GetResponse();               response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);               CookieCollection cook = response.Cookies;               //Cookie字串格式               string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);               return cc;           }           catch (Exception ex)           {                              throw ex;           }       }       ///        /// 擷取CookieCollection       ///        ///        ///        ///        ///        public static CookieCollection GetCookieCollection(string loginUrl, string postdata, HttpHeader header)       {           HttpWebRequest request = null;           HttpWebResponse response = null;           try           {               CookieContainer cc = new CookieContainer();               request = (HttpWebRequest)WebRequest.Create(loginUrl);               request.Method = header.method;               request.ContentType = header.contentType;               byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);               request.ContentLength = postdatabyte.Length;               request.AllowAutoRedirect = false;               request.CookieContainer = cc;               request.KeepAlive = true;               //提交請求               Stream stream;               stream = request.GetRequestStream();               stream.Write(postdatabyte, 0, postdatabyte.Length);               stream.Close();               //接收響應               response = (HttpWebResponse)request.GetResponse();               response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);               CookieCollection cook = response.Cookies;               //Cookie字串格式               string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);               return cook;           }           catch (Exception ex)           {               throw ex;           }       }       ///        /// 擷取html       ///        ///        ///        ///        ///        public static string GetHtml(string getUrl, CookieContainer cookieContainer,HttpHeader header)       {           Thread.Sleep(1000);           HttpWebRequest httpWebRequest = null;           HttpWebResponse httpWebResponse = null;           try           {               httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(getUrl);               httpWebRequest.CookieContainer = cookieContainer;               httpWebRequest.ContentType = header.contentType;               httpWebRequest.ServicePoint.ConnectionLimit = header.maxTry;               httpWebRequest.Referer = getUrl;               httpWebRequest.Accept = header.accept;               httpWebRequest.UserAgent = header.userAgent;               httpWebRequest.Method = "GET";               httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();               Stream responseStream = httpWebResponse.GetResponseStream();               StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);               string html = streamReader.ReadToEnd();               streamReader.Close();               responseStream.Close();               httpWebRequest.Abort();               httpWebResponse.Close();               return html;           }           catch (Exception e)           {               if (httpWebRequest != null) httpWebRequest.Abort();               if (httpWebResponse != null) httpWebResponse.Close();               return string.Empty;           }        }    }    public class HttpHeader    {        public string contentType { get; set; }        public string accept { get; set; }        public string userAgent { get; set; }        public string method { get; set; }        public int maxTry { get; set; }    }}

登陸頁面

後台登陸        

系統

列印出你擷取到的 cookie 的值

列印出你擷取到的 cookie 的值
o8ru11js96qn9rneqokpc6alo2是這個嗎?

列印出你擷取到的 cookie 的值 GuestName|s:5:"admin";UserId|N;這個?

說錯了,要同時列印 cookie 變數名和值
tp 的表單有可能使用了 token,也要處理的

類比登入的流程是:
1、訪問登陸頁,擷取表單元素名和值(已知的話可跳過)
2、擷取 cookie、擷取可能存在的 token
3、擷取可能存在的驗證碼圖片並解析。如果有驗證碼,還需重新擷取 cookie
4、發送應提交的資料集合和 cookie 到表單目標頁

說錯了,要同時列印 cookie 變數名和值
tp 的表單有可能使用了 token,也要處理的

類比登入的流程是:
1、訪問登陸頁,擷取表單元素名和值(已知的話可跳過)
2、擷取 cookie、擷取可能存在的 token
3、擷取可能存在的驗證碼圖片並解析。如果有驗證碼,還需重新擷取 cookie
4、發送應提交的資料集合和 cookie 到表單目標頁

admin:adminpassword:424__hash__:9dcee4d5bcfb44270f8cbfaebbc2d786_a57a03650a2256a207ed4f6ccaad6bf0

沒有驗證碼,這個__hash__是您指的token嗎?

應該是

你貼出的資料中並沒有 sessionid
你怎麼總是取檢查 session 呢?方向錯了

應該是

你貼出的資料中並沒有 sessionid
你怎麼總是取檢查 session 呢?方向錯了 o8ru11js96qn9rneqokpc6alo2這個是sessionid 但是是隨機的 網站自己產生的sessionid是固定的。
哪個方向錯了啊!大神多指點指點,不懂呢

如果有 session 那麼他在 cookie 資料中表現為
PHPSESSID:.................
你列印出的資料中沒有這樣的內容

c#不懂,但你每次串連伺服器伺服器都會重建立立一個session(伺服器端設定檔裡面設定的?),但是你的用戶端這邊好像並沒有再次接受這個sessionid,還是使用以前的sessionid,你在程式中寫上當退出頁面的時候刪除cookie行不行呢

如果有 session 那麼他在 cookie 資料中表現為
PHPSESSID:.................
你列印出的資料中沒有這樣的內容 謝謝大神,仔細思考了一下,我那些資料是通過chromeF12跟蹤到的FormData,具體什麼是token,新手不懂,但是我感覺我擷取的cookie沒有這個資料,發送的cookie也沒有,PHPSESSID在我的程式中就是cookie.Value的值,這個是我跟蹤調試時發現的,而且在我擷取cookie的時候,伺服器存session的檔案夾裡面已經有對應id的session了,裡面的內容也存了admin,只是沒有密碼資訊,可能是安全考慮。
下面我把session的內容發出來,您給看看,該怎麼弄。
先發產生的固定session,sess_60k402oc795mpvihq9jodpnml7

GuestName|s:5:"admin";UserId|N;__hash__|a:2:{s:32:"29b296010dbae92683f9cfada6743386";s:32:"f6f026587c241f4f2f6f94ed4e957ccb";s:32:"d150a69b13ade312006133d91f4fc9b1";s:32:"ef751c9ebc0066c0a98731b2b819ac98";}

再發隨機產生的session,sess_ln3gn3acd5a6arme32h3viq3e5
GuestName|s:5:"admin";UserId|N;

如果不開啟用戶端直接網站登入,那麼只會產生固定的那個session;如果開啟用戶端登入,就會先產生一個隨機的,當通過用戶端開啟瀏覽器登入時,又會產生一個固定的,此時固定的沒有GuestName資訊。
其中GuestName是使用者名稱的資訊,網站的一切操作許可權都是關聯的這個GuestName,UserId始終是N,不知道是什麼意思,__hash__我感覺是操作產生的記錄資訊,因為每一個頁面跳轉操作都會重新整理__hash__內容。
我的問題出在哪裡呢?

c#不懂,但你每次串連伺服器伺服器都會重建立立一個session(伺服器端設定檔裡面設定的?),但是你的用戶端這邊好像並沒有再次接受這個sessionid,還是使用以前的sessionid,你在程式中寫上當退出頁面的時候刪除cookie行不行呢 之前的php設定檔我從來沒動過,後來修改了一下,不好使然後又改了回去。。。刪除cookie肯定也是不行的撒,那個固定的cookie根本就沒有使用者的資訊。

沒改的話php中的session是機率重新整理的,預設只有千分之一,現在phpthink那邊每次都會隨機產生,估計設定檔裡面設定了每次重新開啟網站session百分之百重新整理
你開啟php.ini 看一下session.gc_probability和session.gc_divisor的值分別是多少,這兩個值影響session的重新整理機率
現在你估計只要把裡面的session.gc_probability設為0就能保證session不重新整理

沒改的話php中的session是機率重新整理的,預設只有千分之一,現在phpthink那邊每次都會隨機產生,估計設定檔裡面設定了每次重新開啟網站session百分之百重新整理
你開啟php.ini 看一下session.gc_probability和session.gc_divisor的值分別是多少,這兩個值影響session的重新整理機率
現在你估計只要把裡面的session.gc_probability設為0就能保證session不重新整理 沒效果……看來是程式的問題

sessionid 為 60k402oc795mpvihq9jodpnml7 時
產生的臨時檔案為 sess_60k402oc795mpvihq9jodpnml7
至於裡面是什麼內容,則是有你的程式決定的,與旁人無關

此時 cookie 中會有 PHPSESSID:60k402oc795mpvihq9jodpnml7 項
如果你的用戶端程式沒有讀到他,就表示你的用戶端程式有問題
鑒於你的用戶端是 C# 的,你應該到 .net 版面去求解,顯然那邊 C# 的水平高於這裡

sessionid 為 60k402oc795mpvihq9jodpnml7 時
產生的臨時檔案為 sess_60k402oc795mpvihq9jodpnml7
至於裡面是什麼內容,則是有你的程式決定的,與旁人無關

此時 cookie 中會有 PHPSESSID:60k402oc795mpvihq9jodpnml7 項
如果你的用戶端程式沒有讀到他,就表示你的用戶端程式有問題
鑒於你的用戶端是 C# 的,你應該到 .net 版面去求解,顯然那邊 C# 的水平高於這裡 好的 謝謝 經過您的講解 我也覺得是程式的問題

你用瀏覽器去訪問你的登陸頁面,如果不出問題,則一定是你的用戶端有問題了

你用瀏覽器去訪問你的登陸頁面,如果不出問題,則一定是你的用戶端有問題了 是的 php後台登入是沒問題的,只是對phpthink一點都不懂,所以才來這邊問問。

既然用瀏覽器沒有問題,顯然瀏覽器也不會懂 phpthink 的
你的用戶端只是類比了瀏覽器的行為,自然也不需要懂 phpthink

既然用瀏覽器沒有問題,顯然瀏覽器也不會懂 phpthink 的
你的用戶端只是類比了瀏覽器的行為,自然也不需要懂 phpthink 那phpthink是怎麼啟動並執行?瀏覽器只懂html嗎?

是的,瀏覽器只懂html
嗯,還懂 js

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.