经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » AJAX » 查看文章
ModifyAjaxResponse,修改ajax请求返回值,前后端调试之利器
来源:cnblogs  作者:oppoic  时间:2023/6/28 8:52:05  对本文有异议

一、概要

先看图

 

京豆多的离谱,你的第一想法肯定是:按F12修改了网页元素

没那么简单,你看支持刷新的

 

 

肯定还是假的,通过 Fiddler 或 Wireshark 等抓包工具修改了响应包;或者干脆改了本地host文件,指向了一个自己写的页面......

这些都太麻烦了,如果能在当前网页上拦截这个请求,并修改返回值,那才是最简单的

二、尝试

一个简单的ajax请求

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>test</title>
  8. </head>
  9. <body>
  10. <div>
  11. <input type="button" value="get_data" id="xhr_get">
  12. </div>
  13. <div>
  14. <p>id -> <span id="id"></span></p>
  15. <p>title -> <span id="title"></span></p>
  16. <p>userId -> <span id="userId"></span></p>
  17. <p>body -> <span id="body"></span></p>
  18. </div>
  19. <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>
  20. <script type="text/javascript">
  21. $('#xhr_get').on('click', function () {
  22. $.ajax({
  23. url: 'https://jsonplaceholder.typicode.com/posts/1',
  24. type: 'GET',
  25. success: function (data) {
  26. $('#id').text(data.id);
  27. $('#title').text(data.title);
  28. $('#userId').text(data.userId);
  29. $('#body').text(data.body);
  30. }
  31. });
  32. });
  33. </script>
  34. </body>
  35. </html>

运行起来,点下按钮看看

 

如何拦截这个ajax请求并修改返回内容呢?

可以实现一个自定义的构造函数重写默认的XMLHttpRequest构造函数,使其在触发实际事件之前重写响应即可。按F12在控制台向页面注入代码试试

  1. var ajax_open_original = XMLHttpRequest.prototype.open;
  2. function intercept_ajax(rule) {
  3. XMLHttpRequest.prototype.open = function () {
  4. var open_arguments = arguments;
  5. var url = open_arguments[1];
  6. var flag = false;
  7. var xhrTxt = '';
  8. if (url.indexOf(rule.pattern) > -1) {
  9. flag = true;
  10. xhrTxt = rule.response;
  11. }
  12. this.addEventListener('readystatechange', function (event) {
  13. if (flag && this.readyState === 4) {
  14. Object.defineProperty(this, 'response', { writable: true });
  15. Object.defineProperty(this, 'responseText', { writable: true });
  16. this.response = this.responseText = xhrTxt;
  17. }
  18. });
  19. return ajax_open_original.apply(this, open_arguments);
  20. };
  21. };
  22. intercept_ajax({
  23. pattern: 'https://jsonplaceholder.typicode.com/posts/1',
  24. response: JSON.stringify({ id: 1, title: '2', userId: 3, body: 'body' })
  25. });

 

 

再次点击按钮,页面已经渲染到新的值了

由此证明,这条路是行的通的,但是不能每次都按F12注入,应该做到自动注入,并把所有拦截规则维护起来

三、Chrome插件

浏览器插件最适合做这个了,新建一个Chrome插件,命名:ModifyAjaxResponse

manifest.json

  1. {
  2. "manifest_version": 3,
  3. "name": "ModifyAjaxResponse",
  4. "description": "Modify response text of ajax requests",
  5. "version": "1.4.0",
  6. "content_scripts": [
  7. {
  8. "matches": [
  9. "<all_urls>"
  10. ],
  11. "js": [
  12. "content_scripts.js"
  13. ],
  14. "run_at": "document_start"
  15. }
  16. ]
  17. }

 "run_at": "document_start",页面加载之前就注入 content_scripts.js,看看其内容

  1. const script = document.createElement('script');
  2. script.setAttribute('type', 'text/javascript');
  3. script.setAttribute('src', chrome.runtime.getURL('dist/pageInjectScript.js'));
  4. document.documentElement.appendChild(script);

向页面动态加载 pageInjectScript.js,用来重写默认的 XMLHttpRequest 构造函数,实现拦截ajax请求。打开博客园测试一下

 

可见 pageInjectScript.js 已经加载进来了,这个不是博客园服务器返回的,而是通过Chrome插件注入的。既然已经注入页面了,那当前页面所有的ajax请求都可以被重写

还差一个维护所有拦截规则的页面。使用 Chrome API 自带的存储 chrome.storage.local 保存即可。简单画个页面,看看最终效果

 

至此,已经可以指哪打哪,随意修改页面展示内容了

  

四、总结

这个当然不是改京豆数量自嗨用的,实际用途以及开发初衷是:前后端对接接口,前端利用本插件,可以快速得到不同的返回值

注:

1)本插件仅重写XMLHttpRequest构造函数,F12网络面板里看到的还是原始返回值,但代码可以获取修改后的值;

2)非开发时间请关闭插件,避免向页面注入无用js

五、相关阅读

修改Ajax返回内容

油猴脚本重写fetch和xhr请求

ajax-interceptor

requestly

六、下载

源码:https://github.com/oppoic/ModifyAjaxResponse

Chrome 商店:https://chrome.google.com/webstore/detail/modifyajaxresponse/odpiadnfijfeggnnodoaaphkkjkmpnia

注:访问不了 Chrome 商店的话,下载源码本地加载src目录 

原文链接:https://www.cnblogs.com/oppoic/p/17505144.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号