zoukankan      html  css  js  c++  java
  • 如何在URL重写后,form标记中的Action值也用虚拟地址?

    如何在URL重写后,form标记中的Action值也用虚拟地址?
    例如我们将一个地址"showpost.aspx?postid=1000"重写为"posts/1000.aspx",如果这个页面中有个表单(form),那么输出到浏览器的HTML中,这个表单的action属性为<form action="showpost.aspx?postid=1000">而不是我们期望的<form action="1000.aspx">,这样就会暴露我们的真实地址,而且感觉也不爽。

    我们可以通过自定义页面基类,重写默认的HtmlTextWriter方法,重写属性输出WriteAttribute(string name, string value, bool encode)方法,当输出action时,将action属性的值强制转换为当前虚URL(HttpContext.Current.Request.RawUrl,上面的1000.aspx)

    最后就是让所有的页面都调用这个基类,修改一下Web.config就好了
    <!-- Openlab.Controls.OLPage为页面基类,Openlab.Controls为基类所在dll -->
    <pages pageBaseType="Openlab.Controls.OLPage, Openlab.Controls"/>

    附页面基类完整代码(参考CS代码完成):

    using System;
    using System.IO;
    using System.Web;
    using System.Web.UI;

    namespace Openlab.Controls
    ...{
        /**//// <summary>
        /// 页面基类
        /// </summary>
        public class OLPage : Page
        ...{
            public OLPage()
            ...{
            }

            Render#region Render

            /**//// <summary>
            ///  重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。
            /// </summary>
            /// <param name="writer"></param>
            protected override void Render(HtmlTextWriter writer)
            ...{

                if (writer is System.Web.UI.Html32TextWriter)
                ...{
                    writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
                }
                else
                ...{
                    writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
                }

                base.Render(writer);
            }
            #endregion


        }

        FormFixers#region FormFixers

        FormFixerHtml32TextWriter#region FormFixerHtml32TextWriter
        internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
        ...{
            private string _url; // 假的URL

            internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
            ...{
                _url = HttpContext.Current.Request.RawUrl;
            }

            public override void WriteAttribute(string name, string value, bool encode)
            ...{
                // 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
                if (_url != null && string.Compare(name, "action", true) == 0)
                ...{
                    value = _url;
                }
                base.WriteAttribute(name, value, encode);
            }
        }
        #endregion
        
        FormFixerHtmlTextWriter#region FormFixerHtmlTextWriter
        internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
        ...{
            private string _url;
            internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
            ...{
                _url = HttpContext.Current.Request.RawUrl;
            }

            public override void WriteAttribute(string name, string value, bool encode)
            ...{
                if (_url != null && string.Compare(name, "action", true) == 0)
                ...{
                    value = _url;
                }

                base.WriteAttribute(name, value, encode);
            }
        }
        #endregion

        #endregion
    }
  • 相关阅读:
    SAP 移动类型 整理
    VB6及VS2005 相关的 树TREE控件,网格控件、电子表格控件、网络图及甘持图控件(项目进度)
    金蝶 PK 用友,第三方评论与自我评价(1)
    谁在开发“工作流”WORKFLOW 产品?
    协同及ERP开发平台,我们如何选择?
    关注“北京广联达软件公司”的项目成本管理系统 !
    一个免费提供的开发平台___"KCOM 商业工程"
    企业 ISO“质量、安全和环境” 三大体系认证的管理系统的开发者 !
    MAXWELL 万胜系统软件公司——为工程建设承包商提供优秀的软件套件!
    Contractor Anywhere (任何地方的承包商)也被 SAGE “赛捷”公司收购 !
  • 原文地址:https://www.cnblogs.com/stone/p/117892.html
Copyright © 2011-2022 走看看