基于this questions and the answers there ,我想问什么是正确的重定向方式。
默认方式使用 Redirect(url, endResponse)会抛出 ThreadAbortException ,因为使用调用 End()
方法的 endResponse=true
进行调用,因此,如果您在 try/中使用它catch block ,这个 exception shown there这可以被认为是错误,但实际上用户试图通过停止页面处理的其余部分来重定向到页面。
其他可能的方法是使用 endResponse=false
调用 Redirect(url, endResponse)
,然后调用 HttpContext.Current.ApplicationInstance.CompleteRequest();
通过使用它,您不会遇到任何异常。
所以问题是使用什么更好以及为什么。
最佳答案
您必须始终使用 endRespose=true
调用重定向,否则任何黑客都可以通过简单地按住重定向来查看页面上的内容。
证明我使用NoRedirect Firefox 保持重定向的插件。然后我测试了这两种情况,结果如下:
我有一个简单的页面,其中包含该文本
<form id="form1" runat="server">
<div>
I am making a redirect - you must NOT see this text.
</div>
</form>
然后在页面加载时尝试在两种情况下进行重定向:
第一种情况,使用Complete Request();
try
{
// redirect with false that did not throw exception
Response.Redirect("SecondEndPage.aspx", false);
// complete the Request
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
catch (Exception x)
{
}
然后就可以看到页面里面有什么了!
第二种情况
try
{
// this is throw the ThreadAbortException exception
Response.Redirect("SecondEndPage.aspx", true);
}
catch (ThreadAbortException)
{
// ignore it because we know that come from the redirect
}
catch (Exception x)
{
}
现在没有显示任何内容。
因此,如果您不希望黑客看到您页面上的内容,您必须将 endResponse 设置为 true 来调用它并停止进行其他处理 - 例如从函数返回而不是继续。
例如,如果您检查用户是否经过身份验证,他可以看到该页面,或者如果没有,他必须重定向到登录,即使在登录中,如果您尝试将 endResponse 设置为 false 来重定向他,那么持有重定向,黑客就可以看看 - 你相信什么不能因为你使用重定向。
我的基本观点是显示如果您不停止将数据发送回浏览器则存在的安全线程。重定向是一个 header 和对浏览器的指令,但同时您需要停止发送任何其他数据,您必须停止发送页面的任何其他部分。
关于asp.net - 重定向到带有 true VS CompleteRequest 和安全线程的 endResponse 的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14641143/