12.2 基础代码
Ajax小偷程序基础代码分为两部分:客户端和服务器端。客户端主要是对XMLHTTP对象的封装,这里采用前面章节中的xmlhttp.js文件,在此不再赘述。服务器端代码文件主要包括:thief.cs、tools.cs和sql.cs。下面分别对这些文件进行讲述。
12.2.1 小偷类Thief
Thief类是本章程序的核心,它用于获取远程数据。该类中分别定义了“GET”和“POST”两种获取方式。其中还定义了一个UrlEncode()私有方法,用来对URL进行编码。并且,GET方法有一种重载形式,允许选择指定的编码方式进行读取。Thief类的实现代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.IO;
using System.Text;
//小偷类
public class Thief
{
public Thief() //初始化
{
}
//通过post方法远程获取一个页面;web:页面的路径;postData:post的数据信息
public static string Post(string Web, string postData)
{
string str = ""; //要返回的结果
postData = postData.Replace(" ", "%20"); //替换空格
try
{
//获取URL并发送字串
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create
(Web);
//定义这个Stream只是为了得到发送字串 经过编码之后得到的byte的长度
//因为如果字符串中存在中文 使用postData.Length得到长度和编码之后的长度是不一样的
Stream myStream = new MemoryStream();
//用默认编码 得到Stream
StreamWriter
myStreamWriter = new StreamWriter(myStream, Encoding.Default);
my
Stream Writer.Write(postData);
myStreamWriter.Flush();
long len = myStream.Length; //目的完成
myStreamWriter.Close(); //关闭流
//请求的类型
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.ContentLength = len; //长度
myHttpWebRequest.Method = "POST"; //方式
//得到请求数据流
Stream newStream = myHttpWebRequest.GetRequestStream();
//编码使用Encoding.Default
,用它得到的中文不会出现乱码,特别是把request("")
//得到的值写入sql
//数据库的时候
myStreamWriter = new StreamWriter(newStream, Encoding.Default);
myStreamWriter.Write(postData);
myStreamWriter.Close();
//获取本次的回馈,先创建接收回馈的类HTTPWEBRESPONSE
HttpWebResponse myHttpWebResponse =
(HttpWebResponse)myHttpWebRequest.
GetResponse();
//创建接收回馈的字节流类
Stream receiveStream = myHttpWebResponse.GetResponseStream();
//得到回写的字节流
Encoding encode = System.Text.Encoding.Default; //默认编码
StreamReader readStream = new StreamReader(receiveStream, encode);
str = readStream.ReadToEnd(); //读出返回字符串
readStream.Close();
myHttpWebResponse.Close(); //关闭资源
return str;
}
catch (Exception e)
{
throw e;
}
}
//对url进行编码;url:请求的路径;enc:编码格式
private static string UrlEncode(string url, Encoding enc)
{
byte[] bs = enc.GetBytes(url); //得到字节表示的数组
StringBuilder sb = new StringBuilder(); //用于返回结果
for (int i = 0; i < bs.Length; i++)
{
//asc码在128以下,直接添加
if (bs[i] < 128)
sb.Append((char)bs[i]);
else
{
sb.Append("%" + bs[i++].ToString("x").PadLeft(2, '0'));
//以格式化好的样式添加
sb.Append("%" + bs[i].ToString("x").PadLeft(2, '0'));
}
}
return sb.ToString();
}
//通过get方法远程获取一个页面;url:要获取页面的路径;enc:编码方式
public static string Get(string url, Encoding enc)
{
string tempurl = UrlEncode(url, enc); //对url进行编码
HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl);
//创建请求
HttpWebResponse wb = (HttpWebResponse)webr.GetResponse();
Stream sr = wb.GetResponseStream(); //得到返回数据流
StreamReader sr1 = new StreamReader(sr, enc); //用于读取数据流的内容
string zz = sr1.ReadToEnd(); //读取完成
sr1.Close();
wb.Close(); //关闭连接
return zz;
}
//以指定GB2312编码的方式,通过get方法远程获取一个页面;url:要获取页面的路径
public static string Get(string url)
{
Encoding enc = Encoding.GetEncoding("gb2312");
return Get(UrlEncode(url, enc), enc);
}
}
12.2.2 工具类Tools
小偷程序和正则表达式应用密切相关。Tools类利用正则表达式过滤掉一些特定标记,如超链接、控制符等。其中,它还包括一个方法getpost(),用于获取POST过来的参数。Tools.cs的代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
using System.Text;
// 工具类
public class Tools
{
public Tools()
{
}
//删除控制符
public static string delOption(string str)
{
eturn Regex.Replace(str, @"(\n)|(\t)|(\r)|(\v)|(\f)", "");
}
//删除超链接
public static string DelLink(string str)
{
if (str != null && str.Trim() != "")
return Regex.Replace(str, "(<a[^>]+>)|(</a *>)", "");
return str;
}
// 得到Post的数据
public static string getpost()
{
HttpRequest req = HttpContext.Current.Request;//当前请求
StringBuilder sb = new StringBuilder();
string[] keyall = req.Form.AllKeys; //表格的内容
foreach (string str in keyall) //添加每个参数
{
sb.AppendFormat("{0}={1}&", str, req.Form[str]);
}
if (sb.ToString().EndsWith("&")) //如果以&结尾,删除这个字符
{
sb.Remove(sb.Length - 1, 1);
}
return sb.ToString();
}
// 删除标记;str:输入字符串;tag:标记名称;isContent:是否清除内容
public static string delTag(string str, string tag, bool isContent)
{
if (tag == null || tag == "") //没有指定标记
{
return str;
}
if (isContent) //要求清除内容
{
return
Regex.Replace(str,
string.Format(@"<({0})[^>]*>(.*?)<\/\1>",
tag),
"", RegexOptions.IgnoreCase);
}
//清除标记
return Regex.Replace(str,
string.Format(@"(<{0}[^>]*(>)?)|(</{0}[^>]*>)|",
tag),
"", RegexOptions.IgnoreCase);
}
}
12.2.3 数据库操作类Sql
Sql类负责数据库操作。它主要由两个方法组成:GetDS()和ExecuteSql(),分别用来实现数据查询和非查询语句的执行。代码如下所示:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
//数据库操作类
public class Sql
{
private string str; //数据库连接字符串
public SqlConnection Con; //数据库连接
public Sql()
{
str = GetConn(); //得到数据库连接字符串
Con = new SqlConnection(str); //数据库连接对象
}
public static string GetConn()
{
//数据库的路径
string
path=System.Web.HttpContext.Current.Server.MapPath(System.Web.
HttpContext.
Current.Request.ApplicationPath);
//数据库连接字符串
return "Data Source=.\\SQLEXPRESS;AttachDbFilename=\"" + path + "\\App_ Data\\tv.mdf\";Integrated Security=True;User Instance=True";
}
// 输入查询字符串,返回dataset
public DataSet GetDS(string sql)
{
SqlCommand command = new SqlCommand(sql, Con); //初始化命令对象
command.CommandText = sql; //赋予语句
DataSet dt = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(command); //适配器
Con.Open();
da.Fill(dt); //获得数据
command.Connection.Close(); //关闭连接
return dt;
}
// 是否关闭数据库连接 可以选择;sql。语句;closeConnection:是否关闭连接
public void ExecuteSql(string sql, bool closeConnection)
{
if (Con.State != ConnectionState.Open) //如果连接未打开,则打开连接
Con.Open();
SqlCommand Com = new SqlCommand(sql, Con); //命令
Com.ExecuteNonQuery(); //执行
if (closeConnection) Con.Close(); //如果需要关闭,则关闭
}
}







