GVKun编程网logo

如何检查浏览器中是否打开了HTTP请求?(检测所有网页是否打开)

33

本文将带您了解关于如何检查浏览器中是否打开了HTTP请求?的新内容,同时我们还将为您解释检测所有网页是否打开的相关知识,另外,我们还将为您提供关于ASP.NET–如何检查浏览器支持html5?、c#–

本文将带您了解关于如何检查浏览器中是否打开了HTTP请求?的新内容,同时我们还将为您解释检测所有网页是否打开的相关知识,另外,我们还将为您提供关于ASP.NET – 如何检查浏览器支持html5?、c# – 检查请求是否来自套接字侦听器中的HTTP或HTTPS、dart系列之:浏览器中的舞者,用dart发送HTTP请求、HTTP--浏览器输入URL后HTTP请求返回的完整过程(一)的实用信息。

本文目录一览:

如何检查浏览器中是否打开了HTTP请求?(检测所有网页是否打开)

如何检查浏览器中是否打开了HTTP请求?(检测所有网页是否打开)

有没有一种简单的方法来检测XMLHttpRequest在浏览器窗口中是否处于活动状态?还是有多少活跃?即。有没有一种方法可以检测我的浏览器窗口中是否有活动的AJAX调用?

问题的扩展: 使用javascript有没有办法查看是否打开了XMLHttpRequests?例如“
window.XMLisActive()”或类似的东西?

解决方案:最终为XMLHttpRequest写一个包装器https://gist.github.com/1820380

答案1

小编典典

除非您为JS编写一个包装器XmlHttpRequest(或对其进行猴子补丁处理)以跟踪打开的连接,否则无法检测到JS中的打开的连接。

这是孩子资本的猴子补丁,不确定是否完美,但这是一个好的开始

  (function() {    var oldOpen = XMLHttpRequest.prototype.open;    window.openHTTPs = 0;    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {      window.openHTTPs++;      this.addEventListener("readystatechange", function() {          if(this.readyState == 4) {            window.openHTTPs--;          }        }, false);      oldOpen.call(this, method, url, async, user, pass);    }  })();

ASP.NET – 如何检查浏览器支持html5?

ASP.NET – 如何检查浏览器支持html5?

如何检查浏览器支持html5?

解决方法

您可以通过将Request.browser.Type与支持html5的浏览器列表进行匹配来实现此目的.

c# – 检查请求是否来自套接字侦听器中的HTTP或HTTPS

c# – 检查请求是否来自套接字侦听器中的HTTP或HTTPS

我有多线程异步套接字监听器.我想检查请求是否安全.但我想在AcceptCallBack方法中检查不是ReceiveCallBack.

我会这样做,因为我希望我的代码适用于HTTP和HTTPS.如果请求来自HTTPS,我将继续使用经过身份验证的SslStream而不是原始套接字.

这是我的代码:

using System;
using System.Net;
using System.Net.sockets;
using System.Threading;
using System.Text;

namespace LearnRequestType
{
    class StackOverFlow
    {
        private static readonly ManualResetEvent _manualResetEvent = new ManualResetEvent(false);

        private void StartListening()
        {
            IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any,9002);

            if (localEndPoint != null)
            {
                Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

                if (listener != null)
                {
                    listener.Bind(localEndPoint);
                    listener.Listen(10);

                    Console.WriteLine("Socket listener is running...");

                    listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);
                }
            }
        }

        private void AcceptCallback(IAsyncResult ar)
        {
            _manualResetEvent.Set();

            Socket listener = (Socket)ar.AsyncState;

            Socket handler = listener.EndAccept(ar);

            StateObject state = new StateObject();
            state.workSocket = handler;

            // I want to understand if request comes from HTTP or HTTPS before this line.
            handler.BeginReceive(state.buffer,StateObject.BufferSize,new AsyncCallback(ReceiveCallback),state);

            listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);
        }

        private void ReceiveCallback(IAsyncResult result)
        {
            StateObject state = (StateObject)result.AsyncState;
            Socket handler = state.workSocket;

            string clientIP = ((IPEndPoint)handler.RemoteEndPoint).Address.ToString();

            int numBytesReceived = handler.EndReceive(result);

            if (!handler.Connected)
            {
                handler.Close();
                return;
            }

            // Read incoming data...
            if (numBytesReceived > 0)
            {
                state.sb.Append(Encoding.ASCII.GetString(state.buffer,numBytesReceived));

                // Read incoming data line by line.
                string[] lines = state.sb.ToString().Split('\n');

                if (lines[lines.Length - 1] == "<EOF>")
                {
                    // We received all data. Do something...

                }
                else
                {
                    // We didn't receive all data. Continue reading...
                    handler.BeginReceive(state.buffer,state.buffer.Length,SocketFlags.None,state);
                }
            }
        }
    }
}

public class StateObject
{
    public Socket workSocket = null;
    public const int BufferSize = 256;
    public byte[] buffer = new byte[BufferSize];
    public StringBuilder sb = new StringBuilder();
}

如果我更改AcceptCallBack方法和StateObject类:

private void AcceptCallback(IAsyncResult ar)
{
    _manualResetEvent.Set();

    Socket listener = (Socket)ar.AsyncState;

    Socket handler = listener.EndAccept(ar);

    try
    {
        sslStream = new SslStream(new NetworkStream(handler,true));

        // try to authenticate
        sslStream.AuthenticateAsServer(_cert,false,System.Security.Authentication.SslProtocols.Tls,true);

        state.workStream = sslStream;
        state.workStream.ReadTimeout = 100000;
        state.workStream.WriteTimeout = 100000;

        if (state.workStream.IsAuthenticated)
        {
            state.workStream.BeginRead(state.buffer,ReceiveCallback,state);
        }
    }
    catch (IOException ex)
    {
        // ıf we get handshake Failed due to an unexpected packet format,this means incoming data is not HTTPS
        // Continue with socket not sslstream
        state.workSocket = handler;
        handler.BeginReceive(state.buffer,state);
    }

    StateObject state = new StateObject();
    state.workStream = handler;

    handler.BeginReceive(state.buffer,state);

    listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);
}

public class StateObject
{
    public Socket workSocket = null;
    public SslStream workStream = null;
    public const int BufferSize = 1024;
    public byte[] buffer = new byte[BufferSize];
    public StringBuilder sb = new StringBuilder();
}

我可以决定传入的数据类型是HTTP还是HTTPS,但如果是HTTP,它每次都会被catch块处理,因此会降低应用程序性能.

还有另一种方式吗?

解决方法

如果我理解正确,您有一个端口,客户端可以使用HTTP或HTTPS进行连接,并且您希望在传输任何数据之前立即知道请求是如何进行的.

在从客户端接收数据之前无法知道这一点. HTTP和HTTPS是TCP之上的协议,它们不能在较低的协议级别上工作,因此没有标志或任何可以说明使用哪种协议的东西.此外,HTTPS只是包含在TLS / SSL流中的普通HTTP流.

您必须读取数据并根据使用的协议确定.或者你必须有单独的HTTP和HTTPS端口,这将使这一点变得微不足道.

要检测它是否是TLS / SSL,您可以查看几个字节并查看其中的内容.The TLS specification表示客户端Hello数据包以协议版本启动,协议版本以两个uint8发送.由于HTTP请求总是将动词作为第一个,因此您可以轻松检查是否有一些第一个字节是字符,然后尝试SSLStream(如果不是).

另请注意,如果您在套接字上启动SSLStream,它可能会从套接字中读取,这将消耗HTTP请求的开头,您无法正常处理它.

所以在你的Accept回调中使用这样的东西:

Socket handler = listener.EndAccept(ar);
byte[] tmp = new byte[2];
handler.Receive(tmp,2,SocketFlags.Peek);
if (!Char.IsLetter((char)tmp[0]) || !Char.IsLetter((char)tmp[1]))
{
  // Doesn't start with letters,so most likely not HTTP
} else {
  // Starts with letters,should be HTTP
}

如果您想确保它是TLS / SSL,您可以查看this question on SO

dart系列之:浏览器中的舞者,用dart发送HTTP请求

dart系列之:浏览器中的舞者,用dart发送HTTP请求

简介

dart:html包为dart提供了构建浏览器客户端的一些必须的组件,之前我们提到了HTML和DOM的操作,除了这些之外,我们在浏览器端另一个常用的操作就是使用XMLHttpRequest去做异步HTTP资源的请求,也就是AJAX请求。

dart同样提供了类似JS中XMLHttpRequest的封装,其对应的类叫做HttpRequest,一起来看看在dart中怎么使用HttpRequest吧。

发送GET请求

虽然现代的web APP被各种框架所封装,但是归根结底他还是一个AJAX的富客户端应用。我们通过各种异步的HTTP请求向服务器端请求数据,然后展示在页面上。一般来说数据的交互格式是JSON,当然也可以有其他的数据交互格式。

AJAX中最常用的方式就是向服务器端发送get请求,对应的HttpRequest有一个getString方法:

  static Future<String> getString(String url,
      {bool? withCredentials, void onProgress(ProgressEvent e)?}) {
    return request(url,
            withCredentials: withCredentials, onProgress: onProgress)
        .then((HttpRequest xhr) => xhr.responseText!);
  }

注意,getString方法是一个类方法,所以直接使用HttpRequest类来调用:

var name = Uri.encodeQueryComponent(''John'');
        var id = Uri.encodeQueryComponent(''42'');
        HttpRequest.getString(''users.json?name=$name&id=$id'')
          .then((String resp) {
            // Do something with the response.
        });

因为getString返回的是一个Future,所以可以直接在getString后面接then语句,来获取返回的值。

当然,你也可以在async方法中使用await来获取返回值。

Future<void> main() async {
  String pageHtml = await HttpRequest.getString(url);
  // Do something with pageHtml...
}

或者使用try catch来捕获异常:

try {
  var data = await HttpRequest.getString(jsonUri);
  // Process data...
} catch (e) {
  // Handle exception...
}

发送post请求

GET是从服务器拉取数据,相应的POST就是通用的向服务器中提交数据的方法。在HttpRequest中,对应的方法是postFormData:

static Future<HttpRequest> postFormData(String url, Map<String, String> data,
      {bool? withCredentials,
      String? responseType,
      Map<String, String>? requestHeaders,
      void onProgress(ProgressEvent e)?}) {
    var parts = [];
    data.forEach((key, value) {
      parts.add(''${Uri.encodeQueryComponent(key)}=''
          ''${Uri.encodeQueryComponent(value)}'');
    });
    var formData = parts.join(''&'');

    if (requestHeaders == null) {
      requestHeaders = <String, String>{};
    }
    requestHeaders.putIfAbsent(''Content-Type'',
        () => ''application/x-www-form-urlencoded; charset=UTF-8'');

    return request(url,
        method: ''POST'',
        withCredentials: withCredentials,
        responseType: responseType,
        requestHeaders: requestHeaders,
        sendData: formData,
        onProgress: onProgress);
  }

从方法的实现上可以看到,默认情况下使用的Content-Type: application/x-www-form-urlencoded; charset=UTF-8, 也就是说默认是以form表单提交的形式进行的。

在这种情况下,对于承载数据的data来说,会首先进行Uri.encodeQueryComponent进行编码,然后再使用&进行连接。

下面是使用的例子:

var data = { ''firstName'' : ''John'', ''lastName'' : ''Doe'' };
        HttpRequest.postFormData(''/send'', data).then((HttpRequest resp) {
          // Do something with the response.
       });
注意,postFormData中返回的是一个HttpRequest,虽然它叫做Request,但是实际上可以包含response的内容。所以直接使用他获取返回内容即可。

更加通用的操作

上面我们讲解了get和form的post,从代码可以看到,他们底层实际上都调用的是request方法。request是一个更加通用的HTTP请求方法。可以支持POST, PUT, DELETE等HTTP操作。下面是request的方法定义:

  static Future<HttpRequest> request(String url,
      {String? method,
      bool? withCredentials,
      String? responseType,
      String? mimeType,
      Map<String, String>? requestHeaders,
      sendData,
      void onProgress(ProgressEvent e)?})

其中sendData可以是[ByteBuffer],[Blob], [Document], [String], 或者 [FormData] 等格式。

responseType表示的是HttpRequest.responseType,是返回对象的格式,默认情况下是String,也可以是''arraybuffer'', ''blob'', ''document'', ''json'', 或者 ''text''。

下面是一个是直接使用request的例子:

        var myForm = querySelector(''form#myForm'');
        var data = new FormData(myForm);
        HttpRequest.request(''/submit'', method: ''POST'', sendData: data)
          .then((HttpRequest resp) {
            // Do something with the response.
        });

总结

使用HttpRequest可以直接模拟浏览器中的Ajax操作,非常方便。

本文已收录于 http://www.flydean.com/21-dart-http/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

HTTP--浏览器输入URL后HTTP请求返回的完整过程(一)

HTTP--浏览器输入URL后HTTP请求返回的完整过程(一)

浏览器输入URL后HTTP请求返回的完整过程

clipboard.png

  1. 跳转,Redirect
  2. 是否有缓存,APP cache
  3. DNS查找,域名解析ip
  4. 创建TCP链接,之后才有HTTP三次握手,HTTP寻在TCP之上
  5. 发送请求,Request
  6. 接收响应,Response

关于如何检查浏览器中是否打开了HTTP请求?检测所有网页是否打开的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ASP.NET – 如何检查浏览器支持html5?、c# – 检查请求是否来自套接字侦听器中的HTTP或HTTPS、dart系列之:浏览器中的舞者,用dart发送HTTP请求、HTTP--浏览器输入URL后HTTP请求返回的完整过程(一)等相关知识的信息别忘了在本站进行查找喔。

本文标签: