在开发中我们有时可能只想网站中的网页只以html后缀来展示,但是由于开发一般都是使用aspx后缀的页面,那怎么才能实现看起来像伪静态页面,但是实际上还是aspx页面的网站呢,下面的文章做个简单的介绍。
在此需要用到HttpApplication的类,它是.net中处理请求的重要对象,所有的访问页面的请求都会经过它,在这里需要借用它来实现。
这篇文章对其有比较细的介绍,http://www.cnblogs.com/kissdodog/p/3527922.html。
需求:
1.通过访问score.html来进行学生的登陆,真实地址为StudentLogin.aspx
2.当登陆成功后跳转的页面为scrore/112.html(112为学号),真实地址为Score.aspx?sid=112
步骤1:实现对HttpApplication事件的处理
(1)在这里需要新建一个类,继承接口IHttpModule,接口里面有Dispose与Init方法需要实现,方法如下。在Init方法里面可以对HttpApplication的相关事件添加方法,这里只使用其中的2个。
/// <summary>
/// 在Asp.net中,创建在System.Web命名空间下的IHttpModule接口专门用来定义HttpApplication对象的事件处理。实现IHttpModule接口的类称为HttpModule(Http模块)
/// </summary>
public class ReWriteUrl : IHttpModule
{
public ReWriteUrl()
{
}
public void Dispose()
{
}
/// <summary>
/// 在这个方法里面可以对需要的事件进行注册
/// Init在新创建HttpApplication对象实例时会调用一次,后面就不会再调用了
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
//Asp.net处理的第一个事件,表示处理的开始
context.BeginRequest += new EventHandler(context_BeginRequest);
//在当前请求的用户已获授权时发生
context.PostAuthorizeRequest += new EventHandler(context_PostAuthorizeRequest);
}
}
(2)上面实现了接口,还是不能使用的。还需要在web.config下面的System.web下面添加如下的节点。type为上面新建类的命名空间,name为类名。
<!--在Asp.net中,实现IHttpModule接口只是实现HttpModule的第一步,在Asp.net中所使用的HttpModule还必须在网站配置文件中进行注册才能真正生效,并在Asp.net中使用-->
<httpModules>
<add name="ReWriteUrl" type="ComModules.Handler.ReWriteUrl"/>
</httpModules>
在实现了上面的方法后,这个时候时候可以调试一下,随便新建个aspx的页面,在上面的类的init方法里面加个断点,就会发现在访问具体页面之前会先执行此处的代码,将事件绑定上相关的方法。
步骤2:在方法里面写具体的处理办法,主要是通过正则表达式,将访问页面的url地址用预设的表达式进行验证,如果满足条件的话就进行处理。
/// <summary>
/// Asp.net处理的第一个事件,表示处理的开始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication _app = (HttpApplication)sender;
//原始地址
string _url = _app.Request.RawUrl;
foreach (RewriteUrlConfig key in GetConfig())
{
Regex reg = new Regex(key.UrlRuleKey, RegexOptions.IgnoreCase);
if (reg.IsMatch(_url))
{
//如果是需要跳转到sroce.aspx页面,需要将配置信息进行保存,后面会使用
if (key.RewriteUrl.IndexOf('?') > 0)
{
_app.Context.Items.Add("RewriteUrlConfig", key);
_app.Context.Items.Add("Param", reg.Match(_url).Value);//获取到的学生ID
}
else//如果是需要跳转到登陆页面的,直接跳转
{
_app.Context.RewritePath(key.RewriteUrl);
}
break;
}
}
}
/// <summary>
/// 在当前请求的用户已获授权时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void context_PostAuthorizeRequest(object sender, EventArgs e)
{
string _rewriteurl = "";
HttpApplication _app = (HttpApplication)sender;
//如果访问的页面为112.html,则表示需要跳转到score.aspx?sid=112
if (_app.Context.Items.Contains("RewriteUrlConfig") && _app.Context.Items.Contains("Param"))
{
RewriteUrlConfig _url = _app.Context.Items["RewriteUrlConfig"] as RewriteUrlConfig;
_rewriteurl = _url.RewriteUrl;
string _params = _app.Context.Items["Param"].ToString();
Regex _reg = new Regex(_url.ParamRuleKey, RegexOptions.IgnoreCase);
if (_reg.IsMatch(_url.RewriteUrl))
{
foreach (Match _match in _reg.Matches(_url.RewriteUrl))
{
//将配置里url地址中的【$1】用具体的学生ID代替
_rewriteurl = _rewriteurl.Replace(_match.Value, _params);
}
}
}
else//如果为其他页面
{
//原始url
_rewriteurl = _app.Request.RawUrl;
//将访问页面包含StudentLogin.aspx或Score.aspx关键字的页面跳转到正确地址(可能用户具体的网址有些忘记了,但是他们是想访问这些页面的)
foreach (RewriteUrlConfig key in GetConfig())
{
Regex _reg = new Regex(key.RewriteRuleKey, RegexOptions.IgnoreCase);
if (_reg.IsMatch(_app.Request.Url.AbsolutePath))
{
if (key.RewriteUrl.IndexOf("?") > 0)
{
_rewriteurl = key.RewriteUrl.Substring(0, key.RewriteUrl.IndexOf("?")) + _app.Request.Url.Query;
}
else
{
_rewriteurl = key.RewriteUrl;
}
break;
}
}
}
_app.Context.RewritePath(_rewriteurl);
}
/// <summary>
/// 配置哪些类型的地址需要重定向
/// </summary>
/// <returns></returns>
private List<RewriteUrlConfig> GetConfig()
{
List<RewriteUrlConfig> list = new List<RewriteUrlConfig>();
//此配置为,用户访问score.html时跳转到登陆页面
RewriteUrlConfig objConfig = new RewriteUrlConfig();
objConfig.ParamRuleKey = @"\$\d+";
objConfig.UrlRuleKey = @"\bscore\.html\b"; //请求地址正则表达式,用于检查此地址是否需要重定向
objConfig.RewriteUrl = @"~/StudentLogin.aspx";//重写地址,地址重定向后的新地址
objConfig.RewriteRuleKey = @"\/StudentLogin\.aspx";//重写后地址回发正则表达式
list.Add(objConfig);
//此配置为,用户访问[studentid].html时跳转到真实的Score.aspx
objConfig = new RewriteUrlConfig();
objConfig.ParamRuleKey = @"\$\d+"; //此表达式用来匹配RewriteUrl中的【$1】
objConfig.UrlRuleKey = @"\b(?<=score\/)\d+(?=\.html\b)";
objConfig.RewriteUrl = @"~/Score.aspx?sid=$1";
objConfig.RewriteRuleKey = @"\/Score\.aspx";
list.Add(objConfig);
return list;
}
步骤3:测试,在完成上面2步后,浏览score.html就会发现真实是跳转到了StudentLogin.aspx,点击登录页面上的按钮后,跳转的地址为score/112.html,实际上为score.aspx?sid=112