补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
(之乎者也,怪别扭的!)
我们首先搭建一个环境:
IIS 代理一下 Resin 下的 jsp 页面! (Resin 乃是 Java 应用服务器)
1.Resin 获取:
http://www.caucho.com/download/resin-2.1.16.zip
下载后解压某目录,如:
E:\Resin\resin-2.1.16
2.配置 Resin (Java SDK 的配置就不赘述)
用文本编辑器打开:
E:\Resin\resin-2.1.16\conf\resin.conf
<http port='8080'/>
可配置端口,resin 默认的是 8080 !
如果可用就不改!
<welcome-file-list>simplepost.jsp ,index.xtp, index.jsp, index.html </welcome-file-list>
可配置默认欢迎页面!
3.在 E:\Resin\resin-2.1.16\webapps\ 下创建新目录 test:
编写 E:\Resin\resin-2.1.16\webapps\test\index.jsp 并保存!
E:\Resin\resin-2.1.16\webapps\test\ 就是一个 Application
<%@ page import='java.util.*'%>
<HTML>
<head>
<title>test</title>
</head>
<h1>Form Values:</h1>
<table>
<%
Enumeration e = request.getParameterNames();
while (e.hasMoreElements())
{
String name = (String) e.nextElement();
String[] values = (String[]) request.getParameterValues(name);
%>
<tr><td>
<%= name %><td><%= values[0] %>
<%
if (values.length > 1)
{
for (int i = 1; i < values.length; i++)
{
%>,<%= values[i] %><%
}
}
}
%>
</table>
<form action='http://localhost' method='post'>
<input name='Comment' type="text" value="<%= request.getParameter("Comment") %>">
<input name='Comment2' type="text" value="<%= request.getParameter("Comment2") %>">
<input type=submit>
</form>
</body>
</HTML>
4.编写 C# Openlab.UrlCheat.cs : (修改宝玉的代码基础上完成POST操作的处理)
//Openlab.UrlCheat.cs
//命令行编译: csc /t:library Openlab.UrlCheat.cs
//生成的 Openlab.UrlCheat.dll 存放在 IIS 主目录下建一个 bin 目录!
//如: C:\Inetpub\wwwroot\bin\Openlab.UrlCheat.dll
namespace Openlab.UrlCheat
{
using System;
using System.Configuration;
using System.Web;
using System.IO;
using System.Net;
using System.Text;
//原 Globals.cs
/// <summary>
/// Summary description for Globals.
/// </summary>
public class Globals
{
// 默认域名为博客堂
private static string defaultDomain = "blog.joycode.com";
public static bool IsNullorEmpty(string text)
{
if (text != null)
{
return (text.Trim() == string.Empty);
}
return true;
}
/// <summary>
/// 根据Url返回HttpWebResponse对象
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static HttpWebResponse WebResponse(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
return response;
}
/// <summary>
/// 获取网页的编码信息
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
/// <remarks>如果是网页,则其ConentType中含有编码信息,如"text/html; charset=utf-8"</remarks>
public static Encoding GetEncoding(HttpWebResponse response)
{
string name = response.ContentEncoding;
Encoding code = Encoding.Default;
if (name == "")
{
string contentType = response.ContentType;
if (contentType.ToLower().IndexOf("charset") != -1)
{
name = contentType.Substring(contentType.ToLower().IndexOf("charset=") + "charset=".Length);
}
}
if (name != "")
{
try
{
code = Encoding.GetEncoding(name);
}
catch{}
}
return code;
}
/// <summary>
/// 获取文本内容
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
public static string TextContent(HttpWebResponse response)
{
string buffer = "",line;
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, GetEncoding(response));
//buffer = "<base href=http://localhost:1080 />";
while( (line = reader.ReadLine())!=null )
{
buffer += line + "\r\n";
}
stream.Close();
return buffer;
}
//post Copy & paste from QuickStart by playyuer $ at $ Microshaoft.com
//http://chs.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/howto/samples/net/WebRequests/clientPOST.src&file=CS\clientpost.cs&font=3
//另外本人还有一篇老帖可参考
// 《C# 写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!》
// http://blog.csdn.net/playyuer/archive/2003/07/03/2856.aspx
public static string getPage(string url,string payload)
{
System.Net.WebResponse result = null;
string s = "";
try
{
WebRequest req = WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
StringBuilder UrlEncoded = new StringBuilder();
Char[] reserved = {'?', '=', '&'};
byte[] SomeBytes = null;
if (payload != null)
{
int i=0, j;
while(i<payload.Length)
{
j=payload.IndexOfAny(reserved, i);
if (j==-1)
{
UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, payload.Length-i)));
break;
}
UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, j-i)));
UrlEncoded.Append(payload.Substring(j,1));
i = j+1;
}
SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString());
req.ContentLength = SomeBytes.Length;
Stream newStream = req.GetRequestStream();
newStream.Write(SomeBytes, 0, SomeBytes.Length);
newStream.Close();
}
else
{
req.ContentLength = 0;
}
result = req.GetResponse();
Stream ReceiveStream = result.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader sr = new StreamReader( ReceiveStream, encode );
Console.WriteLine("\r\n已接收到响应流");
Char[] read = new Char[256];
int count = sr.Read( read, 0, 256 );
Console.WriteLine("HTML...\r\n");
while (count > 0)
{
String str = new String(read, 0, count);
Console.Write(str);
// add by playyuer
s += str;
count = sr.Read(read, 0, 256);
}
Console.WriteLine("");
return s;
}
catch(Exception e)
{
Console.WriteLine( e.ToString());
Console.WriteLine("\r\n找不到请求 URI,或者它的格式不正确");
return s;
}
finally
{
if ( result != null )
{
result.Close();
}
}
}
/// <summary>
/// 域名
/// </summary>
/// <remarks>如果支持泛域名解析,那么也可以做到1bu.com那样的效果:)</remarks>
public static string Domain
{
get
{
string domain = ConfigurationSettings.AppSettings["Domain"];
if (domain == null || domain == "")
domain = defaultDomain;
return domain;
}
}
/// <summary>
/// 域名的URL
/// </summary>
public static string DomainUrl
{
get
{
string url = Domain.ToLower();
if (!url.StartsWith("http://"))
{
url = "http://" + url;
}
if (!url.EndsWith("/"))
{
url = url + "/";
}
return url;
}
}
/// <summary>
/// 真实地址
/// </summary>
/// <param name="rawUrl"></param>
/// <returns></returns>
public static string RealUrl(string rawUrl)
{
string realUrl;
realUrl = Globals.DomainUrl + rawUrl.TrimStart('/');
return realUrl;
}
static public string ApplicationPath
{
get
{
string applicationPath = HttpContext.Current.Request.ApplicationPath;
if (applicationPath == "/")
{
return string.Empty;
}
else
{
return applicationPath.ToLower();
}
}
}
}
//原 Redirect.cs
/// <summary>
/// 转向URL
/// </summary>
public class Redirect : IHttpHandler
{
public Redirect()
{
}
public void ProcessRequest(HttpContext context)
{
string rawUrl = context.Request.RawUrl.ToLower();
string realUrl = rawUrl;
if (!Globals.IsNullorEmpty(rawUrl))
{
if (!rawUrl.StartsWith("http://"))
{
realUrl = Globals.RealUrl(rawUrl);
}
}
context.Response.Redirect(realUrl);
context.Response.End();
}
// Properties
public bool IsReusable
{
get
{
return false;
}
}
}
//原 WebResponse.cs
/// <summary>
/// 输出内容
/// </summary>
public class WebResponse : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string rawUrl = context.Request.RawUrl.ToLower();
if (!Globals.IsNullorEmpty(rawUrl))
{
// 如果是"http://"开头则表示是绝对路径,直接跳转即可
if (!rawUrl.StartsWith("http://"))
{
string realUrl = Globals.RealUrl(rawUrl);
//add by playyuer $ at $ Microshaoft.com
if (context.Request.HttpMethod.ToLower() == "get")
{
HttpWebResponse response = Globals.WebResponse(realUrl);
// 如果不是文本类型的,就跳转
if (!response.ContentType.ToLower().StartsWith("text/"))
context.Response.Redirect(realUrl);
// 文本类型则先获取文本内容,然后直接输出到浏览.
string content = Globals.TextContent(response);
context.Response.Write(content);
}
//add by playyuer $ at $ Microshaoft.com
else //post
{
string S = "";
foreach (string s in context.Request.Form.AllKeys)
{
if (S.Length > 0)
S += "&";
S += s + "=" + context.Request.Form[s];
}
//context.Response.Write(S);
context.Response.Write(Globals.getPage(realUrl,S));
}
}
else
{
context.Response.Redirect(rawUrl);
}
}
else
{
//
}
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
4.IIS 主目录下的 web.Config ,如: C:\Inetpub\wwwroot\web.Config :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation defaultLanguage="c#" debug="true" />
<httpHandlers>
<add verb="*" path="*.gif" type="Openlab.UrlCheat.Redirect, Openlab.UrlCheat" />
<add verb="*" path="*.jpg" type="Openlab.UrlCheat.Redirect, Openlab.UrlCheat" />
<add verb="*" path="*.jpeg" type="Openlab.UrlCheat.Redirect, Openlab.UrlCheat" />
<add verb="*" path="*.rar" type="Openlab.UrlCheat.Redirect, Openlab.UrlCheat" />
<add verb="*" path="*.zip" type="Openlab.UrlCheat.Redirect, Openlab.UrlCheat" />
<add verb="*" path="*.webinfo" type="System.Web.HttpForbiddenHandler"/>
<add verb="GET" path="*" type="Openlab.UrlCheat.WebResponse, Openlab.UrlCheat" />
<add verb="POST" path="*" type="Openlab.UrlCheat.WebResponse, Openlab.UrlCheat" />
</httpHandlers>
</system.web>
<appSettings>
<!-- 您可以修改这个域名 -->
<add key="Domain" value="http://localhost:8080/test/" />
</appSettings>
</configuration>
5.运行 Resin 及 IIS
E:\Resin\resin-2.1.16\bin\httpd.exe
6.在 IE 地址栏访问: http://localhost
提交一些数据测试!看看回显是否正确?!
我测的够慢的!
另外宝玉和我都没考虑替换 href 的 url 处理!