我需要清除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
答案 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);