清除查询字符串PostRequestHandlerExecute

时间:2017-03-14 14:34:20

标签: c# asp.net query-string httpmodule

我需要清除queryString,所以我实现了一个httpmodule

 public void Init(HttpApplication context)
            {
             context.PostRequestHandlerExecute += newEventHandler(OnEndRequest);

    }

这是方法:

 public void OnEndRequest(Object sender, EventArgs e)
        {
            HttpApplication context = (HttpApplication)sender;


            if (HttpContext.Current.Request.QueryString != null && HttpContext.Current.Request.QueryString.Count != 0)
            { HttpContext.Current.Request.QueryString.Clear(); }
    }

但它给出了一个例外:

System.NotSupportedException was unhandled by user code
  HResult=-2146233067
  Message=Collection is read-only.

purpuse是隐藏地址栏中显示的参数,为了使用户无法更改参数的值,我不能使用post方法,因为,它是整个应用程序的问题,所以我无法返回所有页面并更改所有代码。 了解;我想要处理请求MyPage.aspx?Param1 = 1并且响应返回给客户端但是地址栏必须显示MyPage.aspx而不是MyPage.aspx?Param1 = 1

3 个答案:

答案 0 :(得分:2)

  

purpuse是隐藏地址栏中显示的参数,以使用户无法更改参数值

这不是HTTP的工作方式。 HTTP应用程序对客户端发送的请求进行操作,因此根据定义,客户端可以查看和更改要发送的所有变量。

  

我想要处理请求MyPage.aspx?Param1 = 1并且响应返回给客户端但是地址栏必须显示MyPage.aspx而不是MyPage.aspx?Param1 = 1

您无法在当前请求期间以任何有意义的方式更改“地址栏”(显示当前请求网址)。即使您可以,例如使用JavaScript(导致值根本不发送)或服务器端通过发出重定向(太晚,值已经发送),这仍然错过了重点:用户可以看到和更改他们发送的一切。

如果此Param1=1实际上是服务器生成的密钥,则对其进行加密。或者,如果它是一个值,它们可以更改为他们没有权限的对象的标识符,然后在处理值之前检查服务器端的权限。

答案 1 :(得分:1)

清除查询字符串的唯一方法是通过响应重定向,例如

Response.Redirect(Request.RawUrl.Replace(Request.Url.Query, ""));

答案 2 :(得分:0)

获得此功能的最佳和最简单的方法(清除请求参数)是 使用客户端方法:

此代码将更新地址栏中显示的网址而不刷新页面(对于使用html5的浏览器)

  var urlElts = document.documentURI.split('?');
                var newUrl = urlElts[0];
                window.history.replaceState("object or string", "Title", newUrl);