公司有一个老站点是通过输入一个员工号来查询信息 原理是通过form表单 POST数据得到人员信息 (但源码已经无法得到了,验证码应该是用Session验证的)
代码如下:
<form action="http://www.test11.com/abc.jsp" method="post" target="_blank">
<tr>
<td>员工号
<input name="idno" type="text" />
<img alt="验证码" src="http://www.test.com/verifycode" />
<input type="text"  name="verifycode"/>
<input type="submit" name="submit" value="查询" />
</td>
</tr>
</form>现在我要做一个新站点 需要引用老页面的查询,验证码还是从老地址取
但是我要把查询的结果去除一些相关的信息 所以自己做了查询页面search.aspx 这个页面就是后台模拟POST数据(也就是向老页面http://www.test11.com/abc.jsp 发送POST数据然后得到结果),再把得到的值加以处理然后显示
代码如下:<form action="http://www.test22.com/search.aspx" method="post" target="_blank">
<tr>
<td>员工号
<input name="idno" type="text" />
<img alt="验证码" src="http://www.test11.com/verifycode" />
<input type="text"  name="verifycode"/>
<input type="submit" name="submit" value="查询" />
</td>
</tr>
</form>search.aspx的代码如下:
Encoding encoding = Encoding.GetEncoding("UTF-8");
byte[] Data = encoding.GetBytes("idno=123456");HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://www.test11.com/abc.jsp");
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = Data.Length;Stream Out = myRequest.GetRequestStream();
Out.Write(Data, 0, Data.Length);
Out.Close();
HttpWebResponse MyResponse = (HttpWebResponse)myRequest.GetResponse();
Stream InStream = MyResponse.GetResponseStream();
StreamReader read = new StreamReader(InStream, encoding);
return read.ReadToEnd();问题是不知道怎么把验证码的Session信息传递给老的页面, 如果不加验证码就无法得到老页面的查询信息
请大家指点!多谢

解决方案 »

  1.   

    加一个cookcontainer System.Net.CookieContainer cook = new System.Net.CookieContainer();
                myRequest.CookieContainer = cook;然后将cook对象保存在session中第二次查询的时候还用这个cook
      

  2.   

    因为我只有一次查询  怎么把用户输入的验证码加到cookcontainer 中呢?  
      

  3.   

    我覺得問題的關鍵是你前端頁面引用舊頁面後在舊頁面產生的 Session 和你自己構造的請求在舊頁面產生的 Session 已經不一致了,呵呵,能僞造出第一次訪問舊頁面時的 Session 嗎?沒試過,不過 Asp.Net 的 Http 頭裡有 SessionId 的,JSP 沒做過,不知道。樓主試試看,有結果就囬一下:)
    如果不行的話,只能改舊頁面了,或者分析那個校驗碼的圖片,自動提取檢驗碼。
      

  4.   


    是的你说的很对 我现在确实不知道怎样伪造出老页面的 Session 然后放到cookcontainer 中
      

  5.   

    你第一次需要输入验证码,验证成功后,对方网站会写cookies到你的cookcontainer 中下次查询时带着cookcontainer 这个对象就已经可以查询了.
      

  6.   

    byte[] Data = encoding.GetBytes("idno=123456&verifycode="+TextBox验证码.Text); 
      

  7.   

    刚试了一下 cookcontainer.Count 居然是0请问这样能取到cookcontainer吗? 
            CookieContainer cookcontainer= new CookieContainer();
            Encoding encoding = Encoding.GetEncoding("GB2312");
            byte[] Data = encoding.GetBytes("idno=123456&verifycode="+TextBox验证码.Text);
            
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
            myRequest.Method = "POST";
            myRequest.ContentType = "application/x-www-form-urlencoded";
            myRequest.ContentLength = Data.Length;
            
            myRequest.CookieContainer = cookcontainer;
            Stream Out = myRequest.GetRequestStream();
            Out.Write(Data, 0, Data.Length);
            Out.Close();
            return cookcontainer;
      

  8.   

    用这种方式也得不到COOKIE CookieCollection CC = response.Cookies;
      

  9.   

    还是取不到cookie 如果直接把验证码POST到老页面的话 会提示验证码过期或错误 肯定是ASP.NET在模拟POST数据的时候又等于重新刷新了验证码请高手指教啊
      

  10.   

    现在问题是如何跨站 把验证码的信息POST到页面我用楼主的号居然说我 提交太快 恶意刷楼 汗
      

  11.   

    没有禁用啊  我调试的时候是选的 接受所有COOKIE的
      

  12.   

    加一个cookcontainer System.Net.CookieContainer cook = new System.Net.CookieContainer(); 
                myRequest.CookieContainer = cook; 然后将cook对象保存在session中 第二次查询的时候还用这个cook