La última colección de preguntas de la entrevista de JAVA (7)

La Internet

79. ¿Qué representan los códigos de respuesta http 301 y 302? ¿Cual es la diferencia?

Respuesta: 301 y 302 son la codificación del estado HTTP, lo que significa que se ha transferido una determinada URL.

la diferencia:

  • Redirección 301: 301 significa Movido permanentemente.

  • Redirección 302: 302 significa Movido temporalmente.

80. ¿La diferencia entre reenviar y redireccionar?

Reenviar y Redirigir representan dos métodos de reenvío de solicitudes: reenvío directo y reenvío indirecto.

Modo de reenvío directo (Forward), el cliente y el navegador solo envían una solicitud una vez, Servlet, HTML, JSP u otros recursos de información, el segundo recurso de información responde a la solicitud, en la solicitud de objeto de solicitud, el objeto guardado es para cada información Recursos son compartidas.

El método de reenvío indirecto (Redirect) es en realidad dos solicitudes HTTP. Cuando el servidor responde a la primera solicitud, el navegador envía una solicitud a otra URL para lograr el propósito de reenvío.

Da un ejemplo popular:

El reenvío directo es equivalente a: "A le pide a B que pida dinero prestado, B dice que no, B va a C para pedir prestado, y si no lo pide, pasará el mensaje a A";

El reenvío indirecto es equivalente a: "A pide a B que pida dinero prestado, B dice que no, deja que A vaya a C para pedir prestado".

81. Describa brevemente la diferencia entre tcp y udp?

  • TCP está orientado a la conexión (como marcar para establecer una conexión antes de realizar una llamada); UDP no tiene conexión, es decir, no es necesario establecer una conexión antes de enviar datos.

  • TCP proporciona servicios confiables. Es decir, los datos transmitidos a través de la conexión TCP no tienen errores, ni pérdidas, ni duplicaciones, y llegan en orden; UDP hace todo lo posible por entregar, es decir, no se garantiza una entrega confiable.

  • Tcp realiza una transmisión confiable a través de suma de verificación, control de retransmisión, identificación del número de serie, ventana deslizante y respuesta de confirmación. Por ejemplo, el control de retransmisión cuando se pierde el paquete, también se puede realizar el control de secuencia de los subpaquetes fuera de secuencia.

  • UDP tiene un mejor rendimiento en tiempo real, mayor eficiencia de trabajo que TCP y es adecuado para transmisión de alta velocidad y comunicación en tiempo real o comunicación de difusión.

  • Cada conexión TCP solo puede ser punto a punto; UDP admite comunicaciones interactivas uno a uno, uno a muchos, muchos a uno y muchos a muchos.

  • TCP requiere más recursos del sistema, mientras que UDP requiere menos recursos del sistema.

82. ¿Por qué el tcp necesita darse la mano tres veces, no puede funcionar dos veces? ¿Por qué?

Para lograr una transmisión de datos confiable, ambas partes en el protocolo TCP deben mantener un número de secuencia para identificar cuál de los paquetes de datos enviados ha sido recibido por la otra parte. El proceso del protocolo de enlace de tres vías es un paso necesario para que las partes comunicantes se informen entre sí del valor inicial del número de serie y confirmen que la otra parte ha recibido el valor inicial del número de serie.

Si solo hay dos apretones de manos, como máximo solo se puede confirmar el número de secuencia inicial del iniciador de la conexión y no se puede confirmar el número de secuencia seleccionado por la otra parte.

83. Cuénteme cómo se generan los paquetes adhesivos tcp.

①. El remitente genera un paquete fijo

El cliente y el servidor que utilizan el protocolo TCP para transmitir datos a menudo mantienen un estado de conexión largo (no hay paquetes pegajosos cuando los datos se envían una vez que se realiza una conexión), y las dos partes siempre pueden transmitir datos cuando la conexión no está desconectada; pero cuando el paquete de datos se envía demasiado pequeño, el protocolo TCP permitirá que el algoritmo de Nagle de forma predeterminada combine y envíe estos paquetes de datos más pequeños (la transmisión de datos en el búfer es un proceso de compresión del montón); este proceso de combinación se lleva a cabo en el búfer de envío , y es decir, cuando se envían los datos, ya están en un estado fijo.
Inserte la descripción de la imagen aquí
②. El receptor genera un paquete pegajoso

Cuando el receptor usa el protocolo TCP para recibir datos, el proceso es así: los datos se pasan a la capa de transporte desde debajo del modelo de red al receptor. El procesamiento del protocolo TCP de la capa de transporte los coloca en el búfer de recepción y luego la capa de aplicación lo obtiene activamente (el lenguaje C usa recv, read y otras funciones); en este momento habrá un problema, es decir, la función de lectura de datos que llamamos en el programa no puede sacar los datos en el búfer en el tiempo, y los siguientes datos vienen y tienen una parte. El final del búfer de colocación es un paquete pegajoso cuando leemos los datos. (La velocidad de colocar datos> la velocidad de tomar datos en la capa de aplicación)

Inserte la descripción de la imagen aquí
84. ¿Cuáles son los modelos de siete capas de OSI?

  • Capa de aplicación: una interfaz entre los servicios de red y los usuarios finales.

  • Capa de presentación: presentación de datos, seguridad y compresión.

  • Capa de sesión: establezca, gestione y finalice sesiones.

  • Capa de transporte: defina el número de puerto del protocolo para la transmisión de datos, así como el control de flujo y la verificación de errores.

  • Capa de red: realice direccionamiento de direcciones lógicas para realizar la selección de rutas entre diferentes redes.

  • Capa de enlace de datos: funciones como el establecimiento de conexiones lógicas, direccionamiento de direcciones de hardware y verificación de errores.

  • Capa física: establezca, mantenga y desconecte conexiones físicas.

85. ¿Cuál es la diferencia entre obtener y publicar solicitudes?

  • GET es inofensivo cuando el navegador retrocede, mientras que POST enviará la solicitud nuevamente.

  • La dirección URL generada por GET se puede marcar, pero no mediante POST.

  • El navegador almacenará activamente en caché las solicitudes GET, mientras que POST no, a menos que se establezca manualmente.

  • Las solicitudes GET solo pueden codificarse en URL, mientras que POST admite varios métodos de codificación.

  • Los parámetros de solicitud GET se conservarán por completo en el historial del navegador, mientras que los parámetros POST no se conservarán.

  • Los parámetros transmitidos en la URL de una solicitud GET tienen una longitud limitada, pero no para POST.

  • Para el tipo de datos del parámetro, GET solo acepta caracteres ASCII, mientras que POST no tiene restricciones.

  • GET es menos seguro que POST, porque los parámetros se exponen directamente en la URL, por lo que no se puede utilizar para transmitir información confidencial.

  • Los parámetros GET se pasan a través de la URL y POST se coloca en el cuerpo de la solicitud.

86. ¿Cómo lograr un dominio cruzado?

Método 1: dominio cruzado de etiqueta de secuencia de comandos o ping de imagen

Los pings de imagen se utilizan a menudo para realizar un seguimiento del número de clics del usuario en las páginas o las exposiciones de anuncios dinámicos.
Las etiquetas de script pueden obtener datos de otras fuentes, lo que también es la base de la confianza de JSONP.

Método 2: dominios cruzados JSONP

JSONP (JSON con relleno) es un "modo de uso" del formato de datos JSON, que permite que las páginas web soliciten datos de otros dominios. Según el objeto XmlHttpRequest se ve afectado por la política del mismo origen, y utilizando esta política abierta del elemento <script>, las páginas web pueden obtener datos JSON generados dinámicamente a partir de otras fuentes, y este modo de uso es el llamado JSONP. Los datos capturados con JSONP no son JSON, sino JavaScript arbitrario, que se ejecutan con un intérprete de JavaScript en lugar de analizarlos con un analizador JSON. Todas, a través de Chrome, todas las solicitudes Get enviadas por JSONP son de tipo js, ​​no XHR.

Inserte la descripción de la imagen aquí
Desventajas:

  • Solo se puede usar Obtener solicitud

  • No es posible registrar funciones de monitoreo de eventos como el éxito y el error, y no es fácil determinar si la solicitud JSONP falló

  • JSONP se ejecuta cargando código de otros dominios. Es vulnerable a ataques de falsificación de solicitudes entre sitios y no se puede garantizar su seguridad.

Método 3: CORS

El intercambio de recursos de origen cruzado (CORS) es una especificación de tecnología de navegador que proporciona un método para que los servicios web envíen scripts de espacio aislado desde diferentes dominios para evitar la política del mismo origen del navegador y garantizar una transmisión segura de datos de dominio de origen cruzado. Los navegadores modernos utilizan CORS en contenedores de API como XMLHttpRequest para reducir el riesgo de solicitudes HTTP. A diferencia de JSONP, CORS también admite otros requisitos HTTP además del método de solicitud GET. El servidor generalmente necesita agregar uno o más de los siguientes encabezados de respuesta:

Inserte la descripción de la imagen aquí
Las solicitudes entre dominios no llevarán información de cookies de forma predeterminada. Si necesita llevarla, configure los siguientes parámetros:
Inserte la descripción de la imagen aquí
Método 4: window.name + iframe

window.name funciona cargando un archivo HTML entre dominios en un iframe (generalmente creado dinámicamente i). Luego, el archivo HTML asigna el contenido de la cadena que se pasa al solicitante a window.name. El solicitante puede recuperar el valor de window.name como respuesta.

  • Capacidades multidominio de las etiquetas iframe;

  • La capacidad del valor del atributo window.name de seguir existiendo después de que se actualice el documento (y el máximo permitido es de aproximadamente 2 M).

Cada iframe tiene una ventana que lo envuelve, y esta ventana es una ventana secundaria de la ventana superior. El atributo contentWindow devuelve el objeto Window del elemento <iframe>. Puede utilizar este objeto Window para acceder al documento iframe y su DOM interno.

<!-- 
 下述用端口 
 10000表示:domainA
 10001表示:domainB
-->

<!-- localhost:10000 -->
<script>
  var iframe = document.createElement('iframe');
  iframe.style.display = 'none'; // 隐藏

  var state = 0; // 防止页面无限刷新
  iframe.onload = function() {
    
    
      if(state === 1) {
    
    
          console.log(JSON.parse(iframe.contentWindow.name));
          // 清除创建的iframe
          iframe.contentWindow.document.write('');
          iframe.contentWindow.close();
          document.body.removeChild(iframe);
      } else if(state === 0) {
    
    
          state = 1;
          // 加载完成,指向当前域,防止错误(proxy.html为空白页面)
          // Blocked a frame with origin "http://localhost:10000" from accessing a cross-origin frame.
          iframe.contentWindow.location = 'http://localhost:10000/proxy.html';
      }
  };

  iframe.src = 'http://localhost:10001';
  document.body.appendChild(iframe);
</script>

<!-- localhost:10001 -->
<!DOCTYPE html>
...
<script>
  window.name = JSON.stringify({
    
    a: 1, b: 2});
</script>
</html>

Método cinco: window.postMessage ()

Las nuevas funciones de HTML5 se pueden utilizar para enviar mensajes a todos los demás objetos de ventana. Cabe señalar que debemos asegurarnos de que todos los scripts se ejecuten antes de enviar MessageEvent. Si se llama durante la ejecución de la función, hará que la función subsiguiente se agote y no se ejecute.

El siguiente código implementa el almacenamiento entre dominios localStorage

<!-- 
 下述用端口 
 10000表示:domainA
 10001表示:domainB
-->

<!-- localhost:10000 -->
<iframe src="http://localhost:10001/msg.html" name="myPostMessage" style="display:none;">
</iframe>

<script>
  function main() {
    
    
      LSsetItem('test', 'Test: ' + new Date());
      LSgetItem('test', function(value) {
    
    
          console.log('value: ' + value);
      });
      LSremoveItem('test');
  }

  var callbacks = {
    
    };
  window.addEventListener('message', function(event) {
    
    
      if (event.source === frames['myPostMessage']) {
    
    
          console.log(event)
          var data = /^#localStorage#(\d+)(null)?#([\S\s]*)/.exec(event.data);
          if (data) {
    
    
              if (callbacks[data[1]]) {
    
    
                  callbacks[data[1]](data[2] === 'null' ? null : data[3]);
              }
              delete callbacks[data[1]];
          }
      }
  }, false);

  var domain = '*';
  // 增加
  function LSsetItem(key, value) {
    
    
      var obj = {
    
    
          setItem: key,
          value: value
      };
      frames['myPostMessage'].postMessage(JSON.stringify(obj), domain);
  }
  // 获取
  function LSgetItem(key, callback) {
    
    
      var identifier = new Date().getTime();
      var obj = {
    
    
          identifier: identifier,
          getItem: key
      };
      callbacks[identifier] = callback;
      frames['myPostMessage'].postMessage(JSON.stringify(obj), domain);
  }
  // 删除
  function LSremoveItem(key) {
    
    
      var obj = {
    
    
          removeItem: key
      };
      frames['myPostMessage'].postMessage(JSON.stringify(obj), domain);
  }
</script>

<!-- localhost:10001 -->
<script>
  window.addEventListener('message', function(event) {
    
    
    console.log('Receiver debugging', event);
    if (event.origin == 'http://localhost:10000') {
    
    
      var data = JSON.parse(event.data);
      if ('setItem' in data) {
    
    
        localStorage.setItem(data.setItem, data.value);
      } else if ('getItem' in data) {
    
    
        var gotItem = localStorage.getItem(data.getItem);
        event.source.postMessage(
          '#localStorage#' + data.identifier +
          (gotItem === null ? 'null#' : '#' + gotItem),
          event.origin
        );
      } else if ('removeItem' in data) {
    
    
        localStorage.removeItem(data.removeItem);
      }
    }
  }, false);
</script>

Preste atención a Safari, informará un error:

Inserte la descripción de la imagen aquí
Para evitar este error, puede consultar el menú de desarrollo ==> deshabilitar la restricción entre dominios en el navegador Safari. O solo se puede implementar mediante el volcado del lado del servidor, porque el navegador Safari solo admite solicitudes de dominio cruzado CORS de forma predeterminada.

Método 6: modificar document.domain en subdominios

Requisito previo: ¡Los dos nombres de dominio deben pertenecer al mismo nombre de dominio básico! Y los protocolos y puertos utilizados deben ser los mismos; de lo contrario, document.domain no se puede usar para dominios cruzados, por lo que solo subdominios cruzados

Dentro del alcance del dominio raíz, se permite establecer el valor del atributo de dominio en su dominio principal. Por ejemplo, en el dominio "aaa.xxx.com", puede establecer el dominio en "xxx.com" pero no en "xxx.org" o "com".

Inserte la descripción de la imagen aquí
Método siete: WebSocket

El protocolo WebSocket es un nuevo protocolo para HTML5. Implementa la comunicación full-duplex entre el navegador y el servidor al tiempo que permite la comunicación entre dominios Es una gran implementación de la tecnología push del servidor. Para artículos relacionados, consulte: WebSocket, WebSocket-SockJS

Nota: El objeto WebSocket no admite detectores de eventos DOM Nivel 2, y cada evento debe definirse por separado utilizando la sintaxis DOM Nivel 0.

Método ocho: agencia

La política del mismo origen es una restricción en el lado del navegador, que puede ser resuelta por el lado del servidor.

Cliente DomainA (navegador) ==> Servidor DomainA ==> Servidor DomainB ==> Cliente DomainA (navegador)

Fuente de ocho métodos de dominio cruzado: blog.csdn.net/ligang2585116/article/details/73072868

87. Cuénteme sobre el principio de implementación de JSONP.

jsonp es json + padding, creando dinámicamente etiquetas de script, usando el atributo src de las etiquetas de script para obtener scripts js en cualquier dominio, a través de esta función (también se puede decir que hay lagunas), el lado del servidor no devuelve el formato json, pero devuelve un párrafo para llamar a un cierto El código js de la función se llama en src, que realiza dominios cruzados.

Supongo que te gusta

Origin blog.csdn.net/weixin_42120561/article/details/114704350
Recomendado
Clasificación