记得前段时间看到过一个关于淘宝URL加密的方法,但现在忘记了,今天有点时间所以自己写了一个用哈希表来处理URL参数的方法。
首先想到的当然是序列化,所以做了以下测试;
浏览页发可以看到以下内容:
其实从上面的数字可以看出哈希表序列化后前面的那一部分代码是一样的,所以我们没有必要把这些拿去传输,再说太找的URL也不好吧,所以我就使用了。。。
首先想到的当然是序列化,所以做了以下测试;
1
public
partial
class
Test : System.Web.UI.Page
2 {
3 Table dt = new Table();
4 public delegate void ForMatEventHandler(string key, string value);
5 protected void Page_Load(object sender, EventArgs e)
6 {
7 dt.Width =Unit.Parse("500px");
8 dt.CellPadding = 2;
9 dt.CellSpacing = 1;
10 dt.BorderWidth = 0;
11 dt.BackColor = Color.FromName("#ccc");
12
13 Hashtable hat = new Hashtable();
14 Hashtable hat2 = new Hashtable();
15 ForMatter(hat, AddRow);
16 ForMatter(hat2, AddRow);
17 hat.Add("1", "abcdef");
18 ForMatter(hat, AddRow);
19 hat2.Add("城市", "北京");
20 ForMatter(hat2, AddRow);
21 hat.Add("acd", "defahefighsl");
22 ForMatter(hat, AddRow);
23 hat2.Add("地区", "石景山区");
24 ForMatter(hat2, AddRow);
25 Page.Controls.Add(dt);
26 }
27 public void ForMatter(object obj, ForMatEventHandler eves)
28 {
29 System.IO.MemoryStream ms = new System.IO.MemoryStream();
30 IFormatter format = new BinaryFormatter();
31 format.Serialize(ms, obj);
32 ms.Position = 0;
33 byte[] bys = new byte[ms.Length];
34 ms.Read(bys, 0, (int)ms.Length);
35 if (eves != null)
36 {
37 eves(obj.GetHashCode().ToString(), Convert.ToBase64String(bys));
38 }
39 ms.Close();
40 ms.Dispose();
41 }
42 public void AddRow(string key, string value)
43 {
44 dt.Rows.Add(new TableRow());
45 dt.Rows[dt.Rows.Count - 1].Cells.Add(new TableCell() { Text = key, BackColor = Color.White });
46 dt.Rows[dt.Rows.Count - 1].Cells.Add(new TableCell() { Text = value, BackColor = Color.White });
47 }
48 }
49
2 {
3 Table dt = new Table();
4 public delegate void ForMatEventHandler(string key, string value);
5 protected void Page_Load(object sender, EventArgs e)
6 {
7 dt.Width =Unit.Parse("500px");
8 dt.CellPadding = 2;
9 dt.CellSpacing = 1;
10 dt.BorderWidth = 0;
11 dt.BackColor = Color.FromName("#ccc");
12
13 Hashtable hat = new Hashtable();
14 Hashtable hat2 = new Hashtable();
15 ForMatter(hat, AddRow);
16 ForMatter(hat2, AddRow);
17 hat.Add("1", "abcdef");
18 ForMatter(hat, AddRow);
19 hat2.Add("城市", "北京");
20 ForMatter(hat2, AddRow);
21 hat.Add("acd", "defahefighsl");
22 ForMatter(hat, AddRow);
23 hat2.Add("地区", "石景山区");
24 ForMatter(hat2, AddRow);
25 Page.Controls.Add(dt);
26 }
27 public void ForMatter(object obj, ForMatEventHandler eves)
28 {
29 System.IO.MemoryStream ms = new System.IO.MemoryStream();
30 IFormatter format = new BinaryFormatter();
31 format.Serialize(ms, obj);
32 ms.Position = 0;
33 byte[] bys = new byte[ms.Length];
34 ms.Read(bys, 0, (int)ms.Length);
35 if (eves != null)
36 {
37 eves(obj.GetHashCode().ToString(), Convert.ToBase64String(bys));
38 }
39 ms.Close();
40 ms.Dispose();
41 }
42 public void AddRow(string key, string value)
43 {
44 dt.Rows.Add(new TableRow());
45 dt.Rows[dt.Rows.Count - 1].Cells.Add(new TableCell() { Text = key, BackColor = Color.White });
46 dt.Rows[dt.Rows.Count - 1].Cells.Add(new TableCell() { Text = value, BackColor = Color.White });
47 }
48 }
49
浏览页发可以看到以下内容:
System.Collections.Hashtable | AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL |
System.Collections.Hashtable | AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAAAAAAAQAwAAAAAAAAAL |
System.Collections.Hashtable | AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AQAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAAEAAAAGBAAAAAExEAMAAAABAAAABgUAAAAGYWJjZGVmCw== |
System.Collections.Hashtable | AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AQAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAAEAAAAGBAAAAAbln47luIIQAwAAAAEAAAAGBQAAAAbljJfkuqwL |
System.Collections.Hashtable | AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AgAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAAIAAAAGBAAAAANhY2QGBQAAAAExEAMAAAACAAAABgYAAAAMZGVmYWhlZmlnaHNsBgcAAAAGYWJjZGVmCw== |
System.Collections.Hashtable | AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AgAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAAIAAAAGBAAAAAblnLDljLoGBQAAAAbln47luIIQAwAAAAIAAAAGBgAAAAznn7Pmma/lsbHljLoGBwAAAAbljJfkuqwL |
其实从上面的数字可以看出哈希表序列化后前面的那一部分代码是一样的,所以我们没有必要把这些拿去传输,再说太找的URL也不好吧,所以我就使用了。。。
Code
Hashtable qList;
String parms;
private readonly string hatFormatHead = "AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tc"
+ "GFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVy"
+ "JFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAA";
public Hashtable QueryList
{
get
{
if (qList == null)
{
qList = new Hashtable();
string parm = Request.QueryString["Parm"];
if (!String.IsNullOrEmpty(parm))
{
try
{
byte[] parms = Convert.FromBase64String(hatFormatHead + parm);
System.IO.MemoryStream stream = new System.IO.MemoryStream();
stream.Write(parms, 0, parms.Length);
IFormatter format = new BinaryFormatter();
stream.Position = 0;
qList = (Hashtable)format.Deserialize(stream);
stream.Close();
stream.Dispose();
}
catch { }
}
foreach (string item in Request.QueryString.AllKeys)
{
if (item == "Parm") continue;
if (qList.ContainsKey(item))
{
qList[item] = Request.QueryString[item];
}
else
{
qList.Add(item, Request.QueryString[item]);
}
}
}
return qList;
}
set { qList = value; }
}
public string QueryParm
{
get
{
if (parms == null)
{
if (QueryList.Count < 1)
{
return "";
}
System.IO.MemoryStream stream = new System.IO.MemoryStream();
IFormatter format = new BinaryFormatter();
format.Serialize(stream, QueryList);
stream.Position = 0;
byte[] parmsb = new byte[stream.Length];
stream.Read(parmsb, 0, (int)stream.Length);
stream.Close();
stream.Dispose();
parms = Convert.ToBase64String(parmsb);
if (parms.Length > hatFormatHead.Length)
{
parms = parms.Substring(hatFormatHead.Length);
}
}
return parms;
}
}
Hashtable qList;
String parms;
private readonly string hatFormatHead = "AAEAAAD/AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tc"
+ "GFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVy"
+ "JFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/AAAAAAoKCwAAAAkCAAAACQMAAAAQAgAAAA";
public Hashtable QueryList
{
get
{
if (qList == null)
{
qList = new Hashtable();
string parm = Request.QueryString["Parm"];
if (!String.IsNullOrEmpty(parm))
{
try
{
byte[] parms = Convert.FromBase64String(hatFormatHead + parm);
System.IO.MemoryStream stream = new System.IO.MemoryStream();
stream.Write(parms, 0, parms.Length);
IFormatter format = new BinaryFormatter();
stream.Position = 0;
qList = (Hashtable)format.Deserialize(stream);
stream.Close();
stream.Dispose();
}
catch { }
}
foreach (string item in Request.QueryString.AllKeys)
{
if (item == "Parm") continue;
if (qList.ContainsKey(item))
{
qList[item] = Request.QueryString[item];
}
else
{
qList.Add(item, Request.QueryString[item]);
}
}
}
return qList;
}
set { qList = value; }
}
public string QueryParm
{
get
{
if (parms == null)
{
if (QueryList.Count < 1)
{
return "";
}
System.IO.MemoryStream stream = new System.IO.MemoryStream();
IFormatter format = new BinaryFormatter();
format.Serialize(stream, QueryList);
stream.Position = 0;
byte[] parmsb = new byte[stream.Length];
stream.Read(parmsb, 0, (int)stream.Length);
stream.Close();
stream.Dispose();
parms = Convert.ToBase64String(parmsb);
if (parms.Length > hatFormatHead.Length)
{
parms = parms.Substring(hatFormatHead.Length);
}
}
return parms;
}
}