A última coleção de perguntas da entrevista JAVA (7)

A Internet

79. O que representam os códigos de resposta http 301 e 302? Qual é a diferença?

Resposta: 301 e 302 são a codificação do status HTTP, o que significa que um determinado URL foi transferido.

A diferença:

  • 301 redirect: 301 significa Permanently Moved.

  • 302 redirecionado: 302 significa temporariamente movido.

80. A diferença entre encaminhar e redirecionar?

Encaminhar e Redirecionar representam dois métodos de encaminhamento de solicitação: encaminhamento direto e encaminhamento indireto.

Modo de encaminhamento direto (Forward), o cliente e o navegador só enviam um pedido uma vez, Servlet, HTML, JSP ou outros recursos de informação, o segundo recurso de informação responde ao pedido, no objeto de pedido pedido, o objeto guardado é para cada Recursos de informação são compartilhadas.

O método de encaminhamento indireto (Redirect) consiste, na verdade, em duas solicitações HTTP. Quando o servidor responde à primeira solicitação, o navegador envia uma solicitação a outro URL para atingir o objetivo de encaminhamento.

Dê um exemplo popular:

O encaminhamento direto é equivalente a: "A pede a B para pedir dinheiro emprestado, B diz que não, B vai para C para pedir emprestado e, se não conseguir, vai passar a mensagem para A";

O encaminhamento indireto é equivalente a: "A pede a B para pedir dinheiro emprestado, B diz que não, deixe A ir para C para pedir emprestado."

81. Descreva resumidamente a diferença entre tcp e udp?

  • O TCP é orientado à conexão (como discagem para estabelecer uma conexão antes de fazer uma chamada); o UDP é sem conexão, ou seja, não há necessidade de estabelecer uma conexão antes de enviar os dados.

  • O TCP fornece serviços confiáveis. Ou seja, os dados transmitidos pela conexão TCP não apresentam erros, perdas, duplicações e chegam ordenados, o UDP faz o possível para entregar, ou seja, não há garantia de entrega confiável.

  • O Tcp realiza uma transmissão confiável por meio de soma de verificação, controle de retransmissão, identificação do número de série, janela deslizante e resposta de confirmação. Por exemplo, o controle de retransmissão quando o pacote é perdido, o controle de sequência dos subpacotes fora de sequência também pode ser executado.

  • O UDP tem melhor desempenho em tempo real, maior eficiência de trabalho do que o TCP e é adequado para transmissão de alta velocidade e comunicação em tempo real ou comunicação de broadcast.

  • Cada conexão TCP só pode ser ponto a ponto; o UDP oferece suporte a comunicações interativas um para um, um para muitos, muitos para um e muitos para muitos.

  • O TCP requer mais recursos do sistema, enquanto o UDP requer menos recursos do sistema.

82. Por que tcp precisa apertar as mãos três vezes, não pode funcionar duas vezes? porque?

Para obter uma transmissão de dados confiável, ambas as partes no protocolo TCP devem manter um número de sequência para identificar quais pacotes de dados enviados foram recebidos pela outra parte. O processo de handshake triplo é uma etapa necessária para que as partes se comuniquem entre si sobre o valor inicial do número de série e confirme se a outra parte recebeu o valor inicial do número de série.

Se houver apenas dois apertos de mão, no máximo apenas o número de sequência inicial do iniciador da conexão pode ser confirmado, e o número de sequência selecionado pela outra parte não pode ser confirmado.

83. Fale-me sobre como os pacotes pegajosos tcp são gerados?

①. O remetente gera um pacote pegajoso

O cliente e o servidor que usam o protocolo TCP para transmitir dados geralmente mantêm um estado de conexão longo (não há nenhum pacote fixo quando os dados são enviados após uma conexão), e as duas partes sempre podem transmitir dados quando a conexão não é desconectada; mas quando o pacote de dados é enviado Muito pequeno, o protocolo TCP habilitará o algoritmo de Nagle por padrão para combinar e enviar esses pacotes de dados menores (a transmissão de dados do buffer é um processo de compressão de heap); este processo de combinação é realizado no buffer de envio , e Ou seja, quando os dados são enviados, eles já estão em um estado fixo.
Insira a descrição da imagem aqui
②. O receptor gera um pacote pegajoso

Quando o receptor usa o protocolo TCP para receber dados, o processo é o seguinte: os dados são passados ​​para a camada de transporte abaixo do modelo de rede para o receptor. O processamento do protocolo TCP da camada de transporte os coloca no buffer de recebimento e então a camada de aplicação o obtém ativamente (a linguagem C usa recv, read e outras funções); neste momento, haverá um problema, ou seja, a função de leitura de dados que chamamos no programa não pode retirar os dados do buffer com o tempo, e os próximos dados chegam e têm uma parte. O fim do buffer put é um pacote pegajoso quando lemos os dados. (A velocidade de colocação de dados> a velocidade de obtenção de dados na camada de aplicativo)

Insira a descrição da imagem aqui
84. Quais são os modelos de sete camadas de OSI?

  • Camada de aplicação: uma interface entre os serviços de rede e os usuários finais.

  • Camada de apresentação: apresentação de dados, segurança e compactação.

  • Camada de sessão: estabelecer, gerenciar e encerrar sessões.

  • Camada de transporte: Defina o número da porta do protocolo para transmissão de dados, bem como controle de fluxo e verificação de erros.

  • Camada de rede: execute o endereçamento de endereço lógico para realizar a seleção do caminho entre as diferentes redes.

  • Camada de enlace: funções como estabelecimento de conexões lógicas, endereçamento de endereços de hardware e verificação de erros.

  • Camada física: estabelecer, manter e desconectar conexões físicas.

85. Qual é a diferença entre solicitações get e post?

  • GET é inofensivo quando o navegador é revertido, enquanto POST enviará a solicitação novamente.

  • O endereço URL gerado por GET pode ser marcado, mas não por POST.

  • As solicitações GET serão ativamente armazenadas em cache pelo navegador, enquanto o POST não será, a menos que seja definido manualmente.

  • As solicitações GET só podem ser codificadas por url, enquanto o POST oferece suporte a vários métodos de codificação.

  • Os parâmetros da solicitação GET serão completamente retidos no histórico do navegador, enquanto os parâmetros POST não serão retidos.

  • Os parâmetros transmitidos na URL de uma solicitação GET são limitados em comprimento, mas não para POST.

  • Para o tipo de dados do parâmetro, GET aceita apenas caracteres ASCII, enquanto POST não tem restrições.

  • GET é menos seguro do que POST, porque os parâmetros são expostos diretamente na URL, portanto, não pode ser usado para transmitir informações confidenciais.

  • Os parâmetros GET são passados ​​por meio da URL e POST é colocado no corpo da solicitação.

86. Como obter domínio cruzado?

Método 1: ping de imagem ou tag de script em vários domínios

Os pings de imagem costumam ser usados ​​para rastrear o número de cliques do usuário nas páginas ou exposições de anúncios dinâmicos.
As tags de script podem obter dados de outras fontes, o que também é a base para a confiança do JSONP.

Método 2: domínio cruzado JSONP

JSONP (JSON com Padding) é um "modo de uso" do formato de dados JSON, que permite que páginas da web solicitem dados de outros domínios. De acordo com o objeto XmlHttpRequest é afetado pela política de mesma origem, e usando esta política aberta do elemento <script>, as páginas da web podem obter dados JSON gerados dinamicamente de outras fontes, e este modo de uso é o chamado JSONP. Os dados capturados com JSONP não são JSON, mas JavaScript arbitrário, executado com um interpretador JavaScript em vez de analisados ​​com um analisador JSON. Todos, por meio do Chrome, todas as solicitações Get enviadas por JSONP são do tipo js, ​​não XHR.

Insira a descrição da imagem aqui
Desvantagens:

  • Só pode usar o pedido Get

  • Não é possível registrar funções de monitoramento de eventos, como sucesso e erro, e não é fácil determinar se a solicitação JSONP falhou

  • JSONP é executado carregando código de outros domínios. É vulnerável a ataques de falsificação de solicitação entre sites e sua segurança não pode ser garantida.

Método 3: CORS

Cross-Origin Resource Sharing (CORS) é uma especificação de tecnologia de navegador que fornece um método para os serviços da Web enviarem scripts de sandbox de diferentes domínios para evitar a política de mesma origem do navegador e garantir a transmissão segura de dados de domínio de origem cruzada. Os navegadores modernos usam CORS em contêineres de API, como XMLHttpRequest, para reduzir o risco de solicitações HTTP. Ao contrário do JSONP, o CORS também oferece suporte a outros requisitos HTTP, além do método de solicitação GET. O servidor geralmente precisa adicionar um ou mais dos seguintes cabeçalhos de resposta:

Insira a descrição da imagem aqui
As solicitações de domínio cruzado não transportarão informações de cookies por padrão. Se você precisar transportá-las, configure os seguintes parâmetros:
Insira a descrição da imagem aqui
Método 4: window.name + iframe

window.name funciona carregando um arquivo HTML de domínio cruzado em um iframe (geralmente criado dinamicamente i). Em seguida, o arquivo HTML atribui o conteúdo da string passado ao solicitante para window.name. O solicitante pode então recuperar o valor window.name como uma resposta.

  • Capacidades de cross-domain de tags iframe;

  • A capacidade do valor do atributo window.name de ainda existir após a atualização do documento (e o máximo permitido é cerca de 2M).

Cada iframe tem uma janela que o envolve, e essa janela é uma janela filha da janela superior. O atributo contentWindow retorna o objeto Window do elemento <iframe>. Você pode usar este objeto Window para acessar o documento iframe e seu 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 ()

Os novos recursos do HTML5 podem ser usados ​​para enviar mensagens para todos os outros objetos de janela. Deve-se observar que devemos garantir que todos os scripts sejam executados antes de enviar MessageEvent. Se for chamado durante a execução da função, fará com que a função subsequente expire e falhe na execução.

O código a seguir implementa o armazenamento de domínio cruzado 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 atenção ao Safari, ele reportará um erro:

Insira a descrição da imagem aqui
Para evitar esse erro, você pode verificar o menu de desenvolvimento ==> desativar a restrição de domínio cruzado no navegador Safari. Ou ele só pode ser implementado por despejo do lado do servidor, porque o navegador Safari só oferece suporte a solicitações de domínio cruzado CORS por padrão.

Método 6: modificar document.domain em subdomínios

Pré-requisito: os dois nomes de domínio devem pertencer ao mesmo nome de domínio básico! E os protocolos e portas usados ​​devem ser os mesmos, caso contrário, document.domain não pode ser usado para domínios cruzados, portanto, apenas subdomínios cruzados

Dentro do escopo do domínio raiz, é permitido definir o valor do atributo de domínio para seu domínio pai. Por exemplo, no domínio "aaa.xxx.com", você pode definir o domínio como "xxx.com", mas não como "xxx.org" ou "com".

Insira a descrição da imagem aqui
Método sete: WebSocket

O protocolo WebSocket é um novo protocolo para HTML5. Ele implementa a comunicação full-duplex entre o navegador e o servidor, permitindo a comunicação entre domínios.É uma ótima implementação da tecnologia push de servidor. Para artigos relacionados, verifique: WebSocket, WebSocket-SockJS

Nota: O objeto WebSocket não oferece suporte a ouvintes de eventos DOM Nível 2 e cada evento deve ser definido separadamente usando a sintaxe DOM Nível 0.

Método oito: agência

A política de mesma origem é uma restrição do lado do navegador, que pode ser resolvida pelo lado do servidor

Cliente DomínioA (navegador) ==> Servidor DomínioA ==> Servidor DomínioB ==> Cliente DomínioA (navegador)

Fonte de oito métodos de domínio cruzado: blog.csdn.net/ligang2585116/article/details/73072868

87. Conte-me sobre o princípio de implementação do JSONP?

jsonp é json + padding, criando tags de script dinamicamente, usando o atributo src de tags de script para obter scripts js em qualquer domínio, por meio deste recurso (também pode ser dito que lacunas), o lado do servidor não retorna o formato json, mas retorna um parágrafo para chamar um certo O código js da função é chamado em src, que realiza cross-domain.

Acho que você gosta

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