asp.net中实现伪静态页面

在开发中我们有时可能只想网站中的网页只以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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值