如何区分用户点击链接和执行自动重定向的页面?

时间:2012-12-27 06:43:07

标签: c# .net winforms redirect webbrowser-control

在我的WinForms应用程序中有一个C#WebBrowser control,并且知道Navigating event,我从未想出过以下的优秀解决方案:

  1. 如果用户主动导航到其他网址,我想允许
  2. 如果网页“自行”重定向到其他网址,我想取消
  3. 对于案例1 ,我可以想到一些案例:

    • 用户点击a标记,评估href属性以加载其他网址。
    • 用户点击带有onclick javascript事件处理程序的元素,该处理程序调用使用window.location加载其他网址的函数。

    对于案例2 ,我可以想象:

    • 加载的页面包含iframe标记,用于在IFrame中加载网址。这会触发Navigating事件。
    • 在页面加载时启动了一些JavaScript计时器,当它触发时,它使用window.location加载另一个URL。
    • 加载的页面包含meta refresh header tag,可在几秒钟后加载另一个网址。

    所以我的问题是:

    如何在Navigating事件(或任何其他机制)中检测重定向是由用户显式触发还是由页面隐式触发?

    更多信息

    • WebBrowser正在基于Windows的CMS后端应用程序中使用。
    • 因此,我可以完全控制WebBrowser控件中加载的内容。
    • 这意味着如果需要,我可以在发送到浏览器之前操作完整的HTML字符串。
    • 如果它更适用,我也很乐意获得只能使用JavaScript的解决方案,我可以将其注入正在加载的HTML中。

    (请注意,我确实认为这不是this SO posting的重复)

2 个答案:

答案 0 :(得分:1)

我对此的看法是捕获用户对Web浏览器控件的点击。让它设置一个标志,指示用户点击了Web浏览器。如果该标志为真,则允许重定向,如果不是,则不允许它。如果没有(或之后)重定向,请确保在n秒后重置标志。

答案 1 :(得分:1)

您似乎正在尝试实现反广告/弹出/重定向模式。

从网络浏览器的角度来看..点击<a href="some.url">与javascript window.location = "some.url"; 302重定向响应没有什么不同。没有明确的信号,没有这样的便利方法。

WebBrowser控件只是IE组件的代理。你不能拦截浏览器的引擎,甚至禁用/启用javascript,因为它是互联网安全选项的一部分。

您必须创建特殊逻辑以防止每种可能的重定向情况。

例如。 验证HTML字符串然后在渲染之前用Regex.Replace限制一些javascript模式,标题或iframe。

var scriptEx = new Regex("<script (.*?)</script>");
var iframeEx = new Regex("<iframe (.*?)</iframe>");

或拦截导航网址并取消不安全的网址等