`
征途2010
  • 浏览: 246516 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

拦截和跟踪HTTP请求的主要方法及实现

阅读更多

一、HTTP 请求的拦截技术可以广泛地应用在反向代理、拦截 Ajax 通信、网页的在线翻译、网站改版重构等方面。而拦截根据位置可以分为服务器端和客户端两大类,客户端拦截借助 JavaScript 脚本技术可以方便地和浏览器的解释器及用户的操作进行交互,能够实现一些服务器端拦截不容易实现的功能。本文将重点介绍通过 JavaScript 脚本在客户端对页面内容进行拦截修改的一些原理和技术

 

 

二、方法简介

 

名称

特点

优点

缺点

利用浏览器的 Event

通过对 [ 鼠标事件 ][ 键盘事件 ][HTML 事件 ][Mutation 事件 ] 的监听,可以对用户的交互,页面的变化,特别是标签节点的变化做出响应

浏览器自身支持,代码量小,几乎可以用来控制所有的 HTML 内容

此方法中的 Mutation EventFirefox2.0 平台已支持,IE6.0 尚未支持

通过 AOP 技术拦截

可以拦截大部分对象的方法调用。

很多 JS 代码库和框架已经支持 AOP 技术,代码简单

ActiveX 对象无法有效拦截。无法拦截普通的函数。另外单独使用此项技术会造成插入点复杂。

覆盖函数进行拦截

通过编写同名方法覆盖系统定义,用户自定义的函数 ( 构造函数 ),达到拦截目的,对普通函数的拦截是对 AOP 的补充。

不依赖其他的代码库和 JS 框架,对系统函数的覆盖有很好的效果,可以拦截构造函数用来控制对象的生成。

拦截自定义函数会造成插入点复杂

通过动态代理进行拦截

主要用来解决 ActiveX 对象的拦截问题,通过构造 ActiveX 对象的代理对象,实现拦截和跟踪。

典型的例子如 IE 平台下 AJAX 通信的拦截

代码复杂,属性更新的同步机制可能导致某些应用异常。

通过自代理和 HTML 解析进行拦截

此方法主要解决的是拦截时机的问题,配合上面的方法,就可以实现很多功能,而不必要等待页面的 onload 事件。

实现浏览器端页面加载前拦截的好方法

代码复杂

 

三、方法的实现

 

1、覆盖系统类 / 方法进行拦截

覆盖已定义的函数是在原函数定义后,调用前通过定义同名函数,达到拦截和跟踪的目的。其一般形式多如下面 :

 

var oriFunction = someFunction;

someFunction = function () {

     return oriFunction(); //or  oriFunction.call(x,);

}

 

第一步是(第一行代码)为了将指向原来函数的指针保存,以便后续使用。

第二步便是定义同名函数,在同名函数里面的适当位置调用原来的功能。这种方法不但可以跟踪原来函数,还可以修改和过滤函数的参数,甚至可以修改返回值。当需要操纵参数的时候,只需在新定义的函数中访问 arguments 对象即可。

例如:针对系统函数 window.open(URL,name,specs,replace) 我们可以通过下面的代码进行拦截:

 

var oriWindowOpen = window.open;

window.open = function(url,names,specs,replace)  {

    url = "http://www.ibm.com"; //or arguments[0]="http://www.ibm.com";

    return oriWindowOpen(url,names,specs,replace);

 }

 

上面的拦截会导致所有的 window.open 调用全部打开 http://www.ibm.com 窗口 。

函数覆盖的适用范围较广,不但可以模拟 AOP 的实现,还可以对非对象函数进行操作。函数覆盖可以根据使用的差异分成若干情况 :

  • 覆盖系统定义的函数、对象的方法:覆盖系统定义的函数或方法可以不用顾及代码插入点的问题,大可以将函数覆盖的代码放置在页面的最前边,并参照上面的形式进行操作。但是特别注意在 IE 平台下对 ActiveX 的对象的方法无效。
  • 覆盖用户自定义的函数、对象的方法:覆盖用户自定义的函数,对象的方法需要考虑代码插入点的问题。正确的代码插入点的位置应该是在原函数定义之后,调用之前。
  • 覆盖构造函数:覆盖构造函数是满足上面两种情况的一种特殊使用形式,跟踪对象创建之除,可以有效地针对对象的需要作出各种特殊的设置。

覆盖构造函数的一般形式 :

 

var oriFunction = someFunction;

someFunction = function () {

    temp = oriFunction(); //oriFunction.call(x,);

    return temp;

}

2、通过动态代理进行拦截

当在 IE6.0 平台遭遇 ActiveX 对象的时候,面对直接的函数覆盖不能奏效的时候,我们可以考虑通过另外一种办法,即动态代理 ActiveX 对象的方式实现拦截和跟踪。

首先我们通过覆盖构造函数的方法,将创建 XMLHttpRequest 对象的过程进行改造。

 

var oriActiveXObject = ActiveXObject;

 

ActiveXObject = function(param) {

    var obj = new oriActiveXObject(param);

    if(param == "Microsoft.XMLHTTP" ||

        param=="Msxml2.XMLHTTP" ||

        param == "Msxml2.XMLHTTP.4.0") {

            return createActiveXAgent(obj);

    }

    return obj;

 };

 

我们将构造过程拦截下来后,进行自己的改造,主要操作是创建对象,对象中设置与 ActiveX 对象相同的属性和方法,并且还需要同步属性方法。

function createActiveXAgent(ao) {

    var agent = newObject;

    agent.activeXObject = ao; //被包裹的内核,是真正的通信对象

    agent.syncAttribute = function() { //syncAttribute是用来同步属性的

        try{

            this.readyState = this.activeXObject.readystate;

            this.responseText = this.activeXObject.responseText;

            this.responseXML = this.activeXObject.responseXML;

            this.status = this.activeXObject.status;

            this.statusText = this.activeXObject.statusText;

        }catch(e) { }

    };

    agent.trigStateChange = function() { //模拟onreadystatechange

        agent.syncAttribute();

        if(agent.onreadystatechange != null) {

            agent.onreadystatechange();

        }

    };

    agent.activeXObject.onreadystatechange = agent.trigStateChange;

    agent.abort = function() { //模拟abort

        this.activeXObject.abort();

        this.syncAttribute();

    };

    agent.getAllResponseHeaders =function()   { //模拟内核对应的方法

        var result = this.activeXObject.getAllResponseHeaders();

        this.syncAttribute();

        return result;

    };

    agent.getResponseHeader = function(headerLabel) { //模拟内核对应的方法

        var result = this.activeXObject.getResponseHeader(headerLabel);

        this.syncAttribute();

        return result;

    };

    agent.open = function(method,url,asyncFlag,userName,password) {

        //codetotraceandintercept;

        url=getParamURL(url,method);

        this.activeXObject.open(method,url,asyncFlag,userName,password);

        this.syncAttribute();

    };

    agent.send = function(content) { //模拟内核对应的方法

        this.activeXObject.send(content);

        this.syncAttribute();

    };

    agent.setRequestHeader = function (label,value) { //模拟内核对应的方法

        this.activeXObject.setRequestHeader(label,value);

        this.syncAttribute();

    };

    return agent;

};

 

 

从上面的代码可以看出来,代理对象通过自身的方法模拟了原来 ActiveX 对象的方法。而更关键的属性问题,是通过在函数调用前后的属性同步函数实现的。即:在调用代理内核方法之前,将属性从代理对象同步给内核对象;在内核方法调用之后,将属性从内核对象同步给代理对象。

因为 AJAX 对象的属性几乎不被用户写入,故上面的实现只需要单向属性同步,即将内核属性同步给代理属性。对于复杂的应用,可以通过双向属性同步函数来解决属性的代理问题。

这种动态代理的方法将 ActiveX 对象像果核一样包裹起来,通过代理对象自身的同名属性和方法提供给外界进行访问,从而达到跟踪和拦截的目的。

 

 

分享到:
评论

相关推荐

    spring aop切面拦截指定类和方法实现流程日志跟踪

    本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...

    访问网页,拦截http请求

    标题中的“访问网页,拦截http请求”涉及到的是网络编程领域的一个关键知识点,即网络数据的抓取和分析。在Web开发或网络安全测试中,我们有时需要监控和拦截HTTP请求,以便理解网页数据交换的过程,或者对请求进行...

    SpringBoot拦截器实现对404和500等错误的拦截

    如果你希望在拦截器中处理404错误,你可以在`preHandle`或`postHandle`方法中检查请求路径,如果找不到对应的Controller方法,可以手动设置响应状态码为404并返回自定义的错误信息。 对于500错误,SpringBoot同样...

    一个BHO示例,主要功能实现URL拦截

    综上所述,这个压缩包文件提供了一个使用VC++和ATL开发的BHO示例,主要用于实现URL拦截,这在网络安全、网页分析和用户行为跟踪等领域有广泛应用。通过学习这个示例,开发者可以了解如何创建自己的BHO插件,并掌握...

    基于Shiro 拦截URL,实现权限控制

    在实现URL权限控制时,Shiro通过定义一系列的拦截器(Interceptors)来过滤请求。这些拦截器可以基于URL路径或特定的HTTP方法(如GET、POST等)来决定是否允许用户访问。Shiro的Web模块提供了一个名为`...

    第四课:RPC与JDBC调用拦截1

    本课程主要关注Dubbo的发送请求拦截和JDBC调用拦截,旨在增强系统监控和性能分析能力。 ### 1. Dubbo发送请求拦截 #### 1.1 埋点采集目标 埋点的主要目的是收集消费者调用服务的相关信息,包括: - 远程接口:调用...

    webservice拦截器demo-服务端和调用端

    客户端拦截器主要用来在发送请求前和接收响应后进行操作,如添加认证信息、跟踪请求或改变请求内容。在CXF中,客户端拦截器同样需要实现`SOAPHandler<SOAPMessageContext>`接口,并在`handleMessage()`方法中实现...

    springmvc 拦截器

    Spring MVC 拦截器是基于Java的Servlet技术,用于处理HTTP请求的一种机制。它允许开发者在Controller处理请求之前或之后执行一些通用的操作,比如权限验证、日志记录、性能统计等。通过拦截器,我们可以将这些重复的...

    CXF使用EndpointImpl发布WebService加入拦截器

    这些示例可能展示了如何创建自定义拦截器,以及如何在`EndpointImpl`中应用这些拦截器,以便在Web服务交互中进行跟踪、验证或其他自定义操作。 通过这种方式,我们可以利用CXF的拦截器机制增强Web服务的功能,提高...

    ssh权限管理和日志拦截器

    在SSH(Struts2、Spring、Hibernate)框架中,权限管理和日志拦截器是两个重要的概念,它们在大型企业级应用开发中起到...在实际开发中,开发者可以根据需求自定义拦截器,实现更复杂的功能,如身份验证、性能跟踪等。

    登录拦截器(通用版)

    登录拦截器是软件开发中一个重要的安全机制,主要用于管理和控制用户访问特定资源的过程。它通常在用户尝试访问受保护的Web应用程序部分时发挥作用,确保只有经过身份验证和授权的用户才能进行操作。在这个通用版的...

    谷歌插件Resource Override,可以拦截请求替换内容

    2. 配置规则:点击插件图标,可以添加新的拦截规则,包括设置匹配的URL模式、请求方法(GET、POST等)以及替换内容。 3. 激活规则:保存规则后,只要满足设置的条件,插件就会自动拦截并替换相应请求的响应内容。 4....

    ssh+aop+log4j+日志拦截器+注解

    在本例中,AOP与日志拦截器结合,可以实现在方法执行前后自动插入日志记录,提高代码的可维护性和可读性。 3. Log4j:Log4j是Apache的一个开源项目,它是一个广泛使用的日志记录工具,提供灵活的日志记录配置,包括...

    自定义拦截器(实现异常处理+细颗粒权限控制).zip

    在Struts2中,拦截器是实现业务逻辑和视图层解耦的关键组件,它们允许开发者在请求到达Action之前或之后执行特定的任务。在这个“自定义拦截器(实现异常处理+细颗粒权限控制)”的项目中,我们将深入探讨如何利用...

    08.CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器

    拦截器通常需要实现`handleMessage(Message)`和`handleFault(Message)`方法,前者处理正常的消息,后者处理异常情况。 ### 四、添加拦截器 1. **客户端添加拦截器**: - 配置文件方式:在`cxf-client.xml`中配置...

    详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)

    在本文中,我们将深入探讨如何在项目中有效地封装和使用axios,以及如何设置拦截器来处理特定...拦截器的使用允许我们在请求和响应过程中插入自定义逻辑,而请求计数器则可以帮助我们跟踪并管理所有网络请求的状态。

    拦截到不同的登录页面

    4. **Web拦截.txt和LoginAuthentication**:这两个文件名可能分别代表文档或类,详细说明了如何实现登录拦截。`Web拦截.txt`可能是一个文本文件,包含了关于如何配置Web服务器或框架以拦截请求的步骤或代码示例。而`...

    spring拦截器的一个简单实例

    现在,每当有请求经过,我们的拦截器就会打印相应的日志信息,实现了简单的请求跟踪。 为了更好地利用拦截器,你可以考虑以下几点: 1. **拦截策略**:可以根据URL模式、请求方法或其他条件来决定哪些请求需要被...

    Struts2的拦截器——Struts2拦截器的基础知识.pptx

    - Struts2提供了一系列内置拦截器,如`params`、`validation`(数据校验)、`i18n`(国际化)、`exception`(异常处理)和`servlet-config`(传递HTTP请求对象)等,这些拦截器满足了大部分常见的Web应用需求。...

Global site tag (gtag.js) - Google Analytics