分类 javascript 下的文章

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>js退出使用!</title>
 <script language="javascript">
  function logout(){
  if( confirm("你确实要退出吗??")){
   window.parent.location.href="http://www.163.com";
  }
  else{
   return;
  }
 }
 </script>
</head>
 <p> <a href="javascript:logout()"> 退出</a></p>
<a href="javascript:history.back();">返回</a>
<body>
</body>
</html>

show.html代码:

<script language=javascript>
 window.open("one.html","_blank","top=0.left=0,width=200,height=200,toolbar=no");
</script>

one.html代码:

<script language=javascript>
window.setTimeout("window.close()",5000);
</script>
<body>
<center><h3>通知</h3></center>
5秒钟以后,这个窗口自动关闭!
</body>

当网页有触发XMLHttpRequest请求时,可以进行重写数据,拦截,修改获取数据等操作。

这个只是hook XMLHttpRequest的,fetchApi 的代码在下面

(function hookXMLHttpRequest() {
  // 备份一下原始open和send方法
  const realOpen = XMLHttpRequest.prototype.open;
  const realSend = XMLHttpRequest.prototype.send;

  // 重写open方法
  XMLHttpRequest.prototype.open = function(method, url) {
    console.log('请求地址是:', url);
    console.log('请求方法类型:', method);

    // 调用原始的open方法
    realOpen.apply(this, arguments);
  };

  // 重写send方法
  XMLHttpRequest.prototype.send = function(data) {
    // 发送请求体参数
    console.log('请求体:', data);

    // 调用原始的send方法,并传入所有参数
    realSend.apply(this, arguments);

    // 监听请求状态变化
    this.addEventListener('readystatechange', () => {
      if (this.readyState === 4) { // 请求已完成
        // 请求完成后执行的代码
        console.log('获取返回的全部数据:', this.responseText);
      }
    });
  };
})();

fetch 看这里

(function hookFetch() {
  // 原始的fetch函数
  const realFetch = window.fetch;

  // 重写window.fetch函数
  window.fetch = function(input, init) {
    // 发送的请求体参数
    console.log('发送请求之前执行的代码',init.body);

    // 在控制台记录请求的URL和选项
    console.log('请求地址是:', input);
    console.log('请求选项:', init);

    // 调用原始的fetch函数,并传入所有参数
    return realFetch.apply(this, arguments).then(response => {
      console.log('响应状态码:', response.status);

      // 如果需要,可以对响应进行额外的处理
      // 例如,根据状态码决定是否抛出错误
      if (response.ok) {
        return response.json(); // 打印返回数据,假设数据是json
      } else {
        return response.text().then(text => {
          throw new Error(`请求失败: ${text}`);        });      }    });  };})();

问题:打印出来请求体为什么是null?

答:因为get请求参数是拼接在路径上,所以请求体是null,要获取请求参数,直接在路径上获取就行,只有post时传入请求体才有显示内容。

问题:这个有什么用处?

答:可以监控网络请求数据,也可以修改请求和返回。

例如:某页面请求列表,参数size显示数量是10,固定的,网页上又没有修改显示数量的地方,那么可以试试修改请求,把请求的参数size 重写为9999(如果后端没做显示限制应该可以一波全部出来),然后请求就会改变

还有某些网站会请求判断是不是vip,例如1就是vip,但是返回的数据是0,可以重写返回的vip数据,0改成1就变成vip。

还有其它功能靠自己想

步骤:1)拷贝以下代码,保存为html文件;

2)解密:双击运行html文件,将"eval(function(p,a,c,k,e,d){...}))"代码拷贝至页面文本框中,点击“解密”,即完成解密过程;

3)加密:双击运行html文件,将需要加密的JS脚本文件内容拷贝至页面文本框中,点击“加密”,即完成加密过程;

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <title>
            JavaScript加解密实用工具
        </title>
        <script>
            a = 62;
            function encode() {
                var code = document.getElementById('code').value;
                code = code.replace(/[\r\n]+/g, '');
                code = code.replace(/'/g, "\\'");
                var tmp = code.match(/\b(\w+)\b/g);
                tmp.sort();
                var dict = [];
                var i, t = '';
                for (var i = 0; i < tmp.length; i++) {
                    if (tmp[i] != t) dict.push(t = tmp[i]);
                }
                var len = dict.length;
                var ch;
                for (i = 0; i < len; i++) {
                    ch = num(i);
                    code = code.replace(new RegExp('\\b' + dict[i] + '\\b', 'g'), ch);
                    if (ch == dict[i]) dict[i] = '';
                }
                document.getElementById('code').value = "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}(" + "'" + code + "'," + a + "," + len + ",'" + dict.join('|') + "'.split('|'),0,{}))";
            }

            function num(c) {
                return (c < a ? '': num(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36));
            }

            function run() {
                eval(document.getElementById('code').value);
            }

            function clearAll() {
                document.getElementById('code').value = '';
            }

            function decode() {
                var code = document.getElementById('code').value;
                code = code.replace(/^eval/, '');
                document.getElementById('code').value = eval(code);
            }
        </script>        
    </head>
    
    <body>        
        <textarea id='code' cols=80 rows=20></textarea>
        <br>
        <input type=button onclick=decode() value=解密>
        <input type=button onclick=encode() value=加密>
        <input type=button onclick=run() value=执行>
        <input type="button" onclick="clearAll()" value="清空">       
    </body>

</html>

拦截HTTP请求是什么?

HTTP,全称是Hyper Text Transfer Protocol,就是超文本传输协议。在Web应用中,客户端与服务器之间的通信都是基于HTTP协议的。在HTTP请求中,我们可以通过拦截HTTP请求,在请求到达服务器之前对请求进行修改或者拦截。这样我们可以在请求发送到服务器之前修改或者添加HTTP请求头,或者查看请求参数和请求结果等等。

为什么要拦截HTTP请求?

拦截HTTP请求可以让我们更好地掌握网络应用程序的整体运行流程和状态。我们可以了解到所有请求的实时状态并实时记录,及时发现问题并进行处理。

在开发过程中,我们可以根据实际需要,通过拦截HTTP请求来修改、添加或删除请求头,从而实现特定的功能。比如,我们可以在请求头中添加一些验证信息,或者在前端请求到后端数据时,可以在请求中添加固定的参数,控制请求流程等等。

如何拦截HTTP请求?

浏览器提供了一些 API 可以用来拦截 HTTP 请求,比如XMLHttpRequest和fetch。下面我们一一了解一下:

1.XMLHttpRequest拦截请求
在原生JavaScript中,我们可以使用XMLHttpRequest来发起请求。其中代表 HTTP 请求的 readyState 属性有 5 种状态。

我们可以针对 readyState 状态来监听和拦截 HTTP 请求。

let xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
  if(xhr.readyState === 4) {  // see the below 5 states
    console.log( xhr.responseText );
  }
};

xhr.open("GET", "/test", true);

xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");

xhr.send();

在上述代码中,我们先创建一个XMLHttpRequest对象xhr,然后去监听 xhr 的状态。当 readyState 为4时,表示请求已经响应完毕。

2.fetch拦截请求
fetch 也是一个用于网络请求的API,它提供了更加简单和方便的请求方式。

fetch('/test')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson);
  });

在fetch中,我们可以使用 then() 函数来对响应做出反应。这里,第一个函数返回一个响应对象 response,然后我们将 response 解析成 JSON,放在myJson中。

我们还可以针对 fetch 的请求进行拦截和修改,以此实现特定的功能。

总结

拦截HTTP请求可以让我们实时监测和记录所有请求的状态,及时发现并处理问题。同时,我们也可以通过拦截HTTP请求,对请求头进行修改,实现特定的功能。在Web应用中,拦截HTTP请求是不可或缺的,而JavaScript又是实现拦截HTTP请求的一种常用方式,可以帮助我们更好地掌握Web应用程序的整体运行状态,并实现特定的功能。