文章目录

  • 前言
  • 思路
  • 代码

前言

笔者在项目开发中有需求,需要拦截 js中 发起的 http 请求和响应数据 写到文件中,方便给开发人员或者测试人员查看。笔者拿到这个需求第一反应是,cef肯定有这种接口可供我们使用,所以肯定能实现咯。这里笔者用的是cef2623版本

思路

笔者百度了一下 大致可以在 CefRequestHandler的回调函数可以得到一些东西,一开始 笔者找到的最相近的方法是 下面这个函数OnResourceLoadComplete,既有request 又有response

  ///// Called on the IO thread when a resource load has completed. |request| and// |response| represent the request and response respectively and cannot be// modified in this callback. |status| indicates the load completion status.// |received_content_length| is the number of response bytes actually read.////*--cef()--*/virtual void OnResourceLoadComplete(CefRefPtr<CefBrowser> browser,CefRefPtr<CefFrame> frame,CefRefPtr<CefRequest> request,CefRefPtr<CefResponse> response,URLRequestStatus status,int64 received_content_length) {}

结果空欢喜一场。我们可以通过request和response指针能 拿到请求头和请求体 和 响应头 响应状态码等 但就是得不到 响应体!

所以 百度不行,当然谷歌了呀。虽然没有得到具体代码提示,但是提示说在 示例程序中有,恍然大悟了 应该回归初心 ,有什么需求或者问题 都可以看cef示例工程。在cefclient有拦截request请求和响应的例子!


代码

笔者需求当然实现了,由于是项目代码 这里不便展示。就把cefclient 中怎么处理的给大家说说。

这里直接说答案,要想获取 http response的响应体,应该在这个回调函数里面做处理。下面处理是在cefclient示例工程的test_runner.cc文件中的这个函数。

CefRefPtr<CefResponseFilter> ClientHandler::GetResourceResponseFilter(CefRefPtr<CefBrowser> browser,CefRefPtr<CefFrame> frame,CefRefPtr<CefRequest> request,CefRefPtr<CefResponse> response) {CEF_REQUIRE_IO_THREAD();return test_runner::GetResourceResponseFilter(browser, frame, request,response);
}

大家继续跟代码,跟踪到response_filter_test.cc文件下的下面这函数。

CefRefPtr<CefResponseFilter> GetResourceResponseFilter(CefRefPtr<CefBrowser> browser,CefRefPtr<CefFrame> frame,CefRefPtr<CefRequest> request,CefRefPtr<CefResponse> response) {// Use the find/replace filter on the test URL.const std::string& url = request->GetURL();//if (url.find(kTestUrl) == 0)//  return new FindReplaceResponseFilter();//if (url.find(kTestUrl) == 0)// return new PassThruResponseFilter();//if (MatchesFilterURL(url))//  return new PassThruResponseFilter();int index2 = url.find("LCX");if ( index2 >= 0 )return new PassThruResponseFilter();return NULL;
}

笔者这里拦截的是url中带有LCX字母的http请求数据。这里最重要的就是下面这个类了。在Filter函数里面data_out参数里面就是 响应体的内容,如果响应体的数据非常大,Filter函数可能会被调用多次。请求头和请求体和响应头可以通过前面的request response指针获取到。

// Filter that writes out all of the contents unchanged.
class PassThruResponseFilter : public CefResponseFilter {public:PassThruResponseFilter() {}bool InitFilter() OVERRIDE {return true;}FilterStatus Filter(void* data_in,size_t data_in_size,size_t& data_in_read,void* data_out,size_t data_out_size,size_t& data_out_written) OVERRIDE {DCHECK((data_in_size == 0U && !data_in) || (data_in_size > 0U && data_in));DCHECK_EQ(data_in_read, 0U);DCHECK(data_out);DCHECK_GT(data_out_size, 0U);DCHECK_EQ(data_out_written, 0U);// All data will be read.data_in_read = data_in_size;// Write out the contents unchanged.data_out_written = std::min(data_in_read, data_out_size);if (data_out_written > 0)memcpy(data_out, data_in, data_out_written);return RESPONSE_FILTER_DONE;}private:IMPLEMENT_REFCOUNTING(PassThruResponseFilter);
};

下面用ajax发一个 http请求 我们自己打个断点测试一把。这里笔者 用一个带jquery的页面,在控制台发起一个get请求进行的测试。


CEF3:拦截http request请求和response响应(包括ajax请求和响应也能拦截到)相关推荐

  1. request请求和response响应时的乱码解决代码

    request乱码 request.setCharacterEncoding("UTF-8"); response乱码 response.setCharacterEncoding( ...

  2. java无响应_Java HttpClient请求无响应解决方案

    首先来看下多线程处理的流程: 在来看下:httpClient请求工具方法: public static String sendGetRequest(String reqURL, String deco ...

  3. shiro ajax权限拦截器,Shiro Ajax请求权限不满足,拦截后解决方案

    Java模拟Http请求 Java模拟Http请求 使用的是org.apache.httpcomponents中的httpclient,因为post请求涉及到传输文件,所以需要使用httpmime这个 ...

  4. 对于苹果手机(ios)微信浏览器 ajax请求无法响应问题

    最近在项目中遇到一个问题,ajax请求一切都是正常的,但是移到了 苹果手机上就出问题了,难了我好久都没发现问题所在,后来测试用get 方式发现 几乎是没有问题的!那么是哪里出了问题了!于是到ios 的 ...

  5. request转发,response重定向,异步请求json数据输出到页面

    request转发: //转发到index.jsp页面request.getRequestDispatcher("index.jsp").forward(request, resp ...

  6. ajax返回的是流如何转换为pdf,如何在AJAX请求成功响应中返回PDF文件

    我通过AJAX获得两个日期,开始和结束日期.我处理这两个日期的数据,生成一个报告,然后返回一个HttpResponse.PDF报告现在保存在我的主项目目录中.现在我得到了AJAX的回复.所以,现在我应 ...

  7. postman响应html,Postman工具——请求与响应(示例代码)

    两个内容: Request 请求和 Response 响应,下面就开始了. 一.Request 请求 Request 请求,我们只介绍常用的四种:GET.POST.PUT.DELETE,其他类型的就不 ...

  8. jquery ajax和servlet,浅谈ajax在jquery中的请求和servlet中的响应

    在jsp中,首先,你需要导入jquery的架包: 获取可返回站点的根路径: String path = request.getContextPath(); %> 在jquery中写ajax请求: ...

  9. Vue总结第七天~Promise网络请求和axios 网络模块

    目录 一.Promise 异步请求(网络请求): 1.Promise是什么? 2.基本使用: 3.链式编程: 二.axios 网络模块 ✿ 更详细的可以看官网:Axios 中文文档 | Axios 中 ...

最新文章

  1. 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  2. 让vs中网站的sln文件使用相对路径的办法
  3. 让你的ASP.NET Core应用程序更安全
  4. 【数值分析】数值分析的微积分学基础
  5. Linux PHY几个状态的跟踪
  6. PAT-BASIC-1003-我要通过!
  7. BricsCAD 21 for Mac(CAD建模软件)多语言版
  8. 从零基础入门Tensorflow2.0 ----三、8. 自定义层次
  9. 未来教育c语言二级51套答案,未来教育版计算机二级C语言上机题库(含答案)
  10. 计算机组成原理——总线
  11. AutoCAD2020简体中文语言包
  12. Firefox 不知道如何打开此地址,因为协议 (javascrpit) 未和任何程序关联.
  13. 地图导航中的路径规划算法(综述)
  14. Pycharm 系统找不到指定的路径 报错!!
  15. 阿里云“网红运维工程师白金:做一个平凡的圆梦人
  16. NEXTCHIP概述-2
  17. 《概率论与数理统计》-第二章 随机变量及其分布-第一节 离散型随机变量及其分布-笔记
  18. windows 控制linux,windows远程控制linux的最佳方案
  19. can报文信号矩阵分析
  20. 转载:linux drm原理及应用

热门文章

  1. 易生信转录组培训第一期总结
  2. 第94课 函数的参数 《小学生C++编程入门》 例94.1
  3. anaconda moviepy_Anaconda和PyCharm的详细安装步骤~小白专用,手把手教学
  4. python实训报告50000_Python程序设计 实验报告五
  5. 电力笔记-30个行业专业词汇(Ⅰ期)
  6. Python笔记-CAPM(资本资产定价模型)例子
  7. C++笔记-初步窥探全局函数在Debug、Release的地址
  8. OpenCV文档阅读笔记-brief Creates a window官方解析及实例
  9. C++工作笔记-仿大佬“容器”风格
  10. 7.2图的存储结构(十字链表、邻接多重表、边集数组)