JAVAインタビューの質問の最新コレクション(7)

インターネット

79. http応答コード301および302は何を表していますか?違いは何ですか?

回答:301と302はHTTPステータスのエンコーディングです。これは、特定のURLが転送されたことを意味します。

違い:

  • 301リダイレクト:301はPermanentlyMovedの略です。

  • 302リダイレクト:302はTemporarilyMovedの略です。

80.転送とリダイレクトの違いは?

ForwardとRedirectは、直接転送と間接転送の2つの要求転送方法を表します。

直接転送モード(転送)、クライアントとブラウザはリクエストを1回だけ送信し、サーブレット、HTML、JSP、またはその他の情報リソース、2番目の情報リソースはリクエストに応答します。リクエストオブジェクトリクエストでは、保存されたオブジェクトは各情報リソース用です。共有されます。

間接転送方式(リダイレクト)は、実際には2つのHTTPリクエストです。サーバーが最初のリクエストに応答すると、ブラウザは転送の目的を達成するために別のURLにリクエストを送信します。

人気のある例を挙げてください。

直接転送は次のようになります。「AはBにお金を借りるように要求し、Bはいいえと言い、BはCに借りて行き、借りに失敗した場合はメッセージをAに渡します」。

間接転送は、「AがBにお金を借りるように頼む、Bがノーと言う、AをCに行かせて借りさせる」と同等です。

81. tcpとudpの違いを簡単に説明してください。

  • TCPはコネクション型です(電話をかける前に接続を確立するためにダイヤルするなど)。UDPはコネクションレス型です。つまり、データを送信する前に接続を確立する必要はありません。

  • TCPは信頼できるサービスを提供します。つまり、TCP接続を介して送信されるデータには、エラー、損失、重複がなく、順番に到着します。UDPは最善を尽くして配信します。つまり、信頼できる配信は保証されません。

  • Tcpは、チェックサム、再送信制御、シリアル番号の識別、スライディングウィンドウ、および確認応答を通じて、信頼性の高い送信を実現します。たとえば、パケットが失われたときの再送信制御では、シーケンス外のサブパケットのシーケンス制御も実行できます。

  • UDPは、TCPよりもリアルタイムのパフォーマンスが高く、作業効率が高く、高速伝送やリアルタイム通信またはブロードキャスト通信に適しています。

  • 各TCP接続はポイントツーポイントでのみ可能です。UDPは1対1、1対多、多対1、および多対多の対話型通信をサポートします。

  • TCPはより多くのシステムリソースを必要としますが、UDPはより少ないシステムリソースを必要とします。

82. tcpが3回握手する必要があるのはなぜですか、2回動作しないのですか?どうして?

信頼性の高いデータ送信を実現するには、TCPプロトコルの両方の当事者がシーケンス番号を維持して、送信されたデータパケットのどちらが他方の当事者によって受信されたかを識別する必要があります。スリーウェイハンドシェイクのプロセスは、通信側がシリアル番号の初期値を相互に通知し、相手がシリアル番号の初期値を受信したことを確認するために必要なステップです。

ハンドシェイクが2つしかない場合は、接続の開始者の初期シーケンス番号しか確認できず、相手が選択したシーケンス番号は確認できません。

83.tcpスティッキパケットがどのように生成されるかについて教えてください。

①。送信者がスティッキーパッケージを生成します

TCPプロトコルを使用してデータを送信するクライアントとサーバーは、多くの場合、長い接続状態を維持し(1回の接続でデータが送信されるときにスティッキーパケットはありません)、接続が切断されていないときは常にデータを送信できます。データパケットの送信が小さすぎると、TCPプロトコルはデフォルトでNagleアルゴリズムがこれらの小さいデータパケットを結合して送信できるようにします(バッファデータ送信はヒープ圧縮のプロセスです)。この結合プロセスは送信バッファで実行されます。 、つまり、データが送信されるとき、データはすでにスティッキー状態になっています。
ここに画像の説明を挿入
②。レシーバーがスティッキーパッケージを生成します

受信者がTCPプロトコルを使用してデータを受信する場合、プロセスは次のようになります。データはネットワークモデルの下から受信者にトランスポート層に渡されます。トランスポート層のTCPプロトコル処理により、データは受信バッファに配置され、次に、アプリケーション層がアクティブに取得します(C言語はrecv、read、およびその他の関数を使用します)。この時点で問題が発生します。つまり、プログラムで呼び出す読み取りデータ関数がバッファー内のデータを取り出せないということです。時間内に、次のデータが来て、一部があります。データを読み取るとき、プットバッファの終わりはスティッキーパケットです。(データを配置する速度>アプリケーション層でデータを取得する速度)

ここに画像の説明を挿入
84. OSIの7層モデルとは何ですか?

  • アプリケーション層:ネットワークサービスとエンドユーザー間のインターフェイス。

  • プレゼンテーション層:データの表示、セキュリティ、および圧縮。

  • セッション層:セッションを確立、管理、および終了します。

  • トランスポート層:データ送信、フロー制御、エラーチェック用のプロトコルポート番号を定義します。

  • ネットワーク層:論理アドレスアドレス指定を実行して、異なるネットワーク間のパス選択を実現します。

  • データリンク層:論理接続の確立、ハードウェアアドレスのアドレス指定、エラーチェックなどの機能。

  • 物理層:物理接続を確立、維持、および切断します。

85. getリクエストとpostリクエストの違いは何ですか?

  • ブラウザがロールバックしてもGETは無害ですが、POSTはリクエストを再度送信します。

  • GETによって生成されたURLアドレスはブックマークできますが、POSTではできません。

  • GETリクエストはブラウザによってアクティブにキャッシュされますが、POSTは手動で設定されない限りキャッシュされません。

  • GETリクエストはURLエンコードのみが可能ですが、POSTは複数のエンコード方法をサポートしています。

  • GETリクエストパラメータはブラウザの履歴に完全に保持されますが、POSTパラメータは保持されません。

  • GETリクエストのURLで送信されるパラメータの長さは制限されていますが、POSTの場合は制限されていません。

  • パラメータのデータ型については、GETはASCII文字のみを受け入れますが、POSTには制限がありません。

  • GETはPOSTよりも安全性が低くなります。これは、パラメータがURLに直接公開されているため、機密情報の送信に使用できないためです。

  • GETパラメータはURLを介して渡され、POSTはリクエストの本文に配置されます。

86.クロスドメインを実現するにはどうすればよいですか?

方法1:画像のpingまたはスクリプトタグのクロスドメイン

画像のpingは、ページのユーザークリック数や動的な広告露出を追跡するためによく使用されます。
スクリプトタグは他のソースからデータを取得できます。これはJSONPの信頼の基礎でもあります。

方法2:JSONPクロスドメイン

JSONP(JSON with Padding)は、データ形式JSONの「使用モード」であり、Webページが他のドメインからデータを要求できるようにします。XmlHttpRequestオブジェクトは同一生成元ポリシーの影響を受け、<script>要素のこのオープンポリシーを使用すると、Webページは他のソースから動的に生成されたJSONデータを取得できます。この使用モードはいわゆるJSONPです。JSONPでキャプチャされたデータはJSONではなく、任意のJavaScriptであり、JSONパーサーで解析される代わりにJavaScriptインタープリターで実行されます。すべて、Chromeを介して、JSONPによって送信されるすべてのGetリクエストは、XHRではなくjsタイプです。

ここに画像の説明を挿入
短所:

  • Getリクエストのみを使用できます

  • 成功やエラーなどのイベント監視機能を登録することはできず、JSONPリクエストが失敗したかどうかを判断するのは簡単ではありません

  • JSONPは、他のドメインからコードをロードすることで実行されます。クロスサイトリクエストフォージェリ攻撃に対して脆弱であり、セキュリティは保証されません。

方法3:CORS

クロスオリジンリソースシェアリング(CORS)は、Webサービスが異なるドメインからサンドボックススクリプトを送信して、ブラウザーの同一生成元ポリシーを回避し、安全なクロスオリジンドメインデータ送信を保証する方法を提供するブラウザーテクノロジ仕様です。最新のブラウザは、XMLHttpRequestなどのAPIコンテナでCORSを使用して、HTTPリクエストのリスクを軽減します。JSONPとは異なり、CORSはGETリクエストメソッドに加えて他のHTTP要件もサポートします。サーバーは通常、次の応答ヘッダーを1つ以上追加する必要があります。

ここに画像の説明を挿入
クロスドメインリクエストはデフォルトではCookie情報を伝達しません。伝達する必要がある場合は、次のパラメーターを構成してください。
ここに画像の説明を挿入
方法4:window.name + iframe

window.nameは、クロスドメインHTMLファイルをiframe(通常は動的に作成されたi)にロードすることで機能します。次に、HTMLファイルはリクエスターに渡された文字列コンテンツをwindow.nameに割り当てます。その後、リクエスターはwindow.name値を応答として取得できます。

  • iframeタグのクロスドメイン機能。

  • ドキュメントが更新された後もwindow.name属性値が存在する能力(および許可される最大値は約2Mです)。

各iframeにはそれをラップするウィンドウがあり、このウィンドウはトップウィンドウの子ウィンドウです。contentWindow属性は、<iframe>要素のWindowオブジェクトを返します。このWindowオブジェクトを使用して、iframeドキュメントとその内部DOMにアクセスできます。

<!-- 
 下述用端口 
 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>

メソッド5:window.postMessage()

HTML5の新機能を使用して、他のすべてのウィンドウオブジェクトにメッセージを送信できます。MessageEventを送信する前に、すべてのスクリプトが実行されていることを確認する必要があることに注意してください。関数の実行中に呼び出されると、後続の関数がタイムアウトして実行に失敗します。

次のコードは、クロスドメインストレージ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>

Safariに注意してください。エラーが報告されます。

ここに画像の説明を挿入
このエラーを回避するには、Safariブラウザで開発メニュー==>クロスドメイン制限を無効にすることを確認してください。または、SafariブラウザはデフォルトでCORSクロスドメインリクエストのみをサポートしているため、サーバー側のダンプによってのみ実装できます。

方法6:サブドメイン間でdocument.domainを変更する

前提条件:2つのドメイン名は同じ基本ドメイン名に属している必要があります!使用するプロトコルとポートは同じである必要があります。そうでない場合、document.domainはクロスドメインに使用できないため、クロスサブドメインのみが使用されます。

ルートドメインのスコープ内で、ドメイン属性の値をその親ドメインに設定できます。たとえば、「aaa.xxx.com」ドメインでは、ドメインを「xxx.com」に設定できますが、「xxx.org」や「com」には設定できません。

ここに画像の説明を挿入
方法7:WebSocket

WebSocketプロトコルは、HTML5の新しいプロトコルです。クロスドメイン通信を可能にしながら、ブラウザとサーバー間の全二重通信を実装します。これは、サーバープッシュテクノロジーの優れた実装です。関連記事については、WebSocket、WebSocket-SockJSを確認してください。

注:WebSocketオブジェクトはDOMレベル2イベントリスナーをサポートしておらず、各イベントはDOMレベル0構文を使用して個別に定義する必要があります。

方法8:代理店

同一生成元ポリシーはブラウザ側の制限であり、サーバー側で解決できます

DomainAクライアント(ブラウザ)==> DomainAサーバー==> DomainBサーバー==> DomainAクライアント(ブラウザ)

8つのクロスドメインメソッドのソース:blog.csdn.net/ligang2585116/article/details/73072868

87.JSONPの実装原理について教えてください。

jsonpはjson + paddingであり、スクリプトタグを動的に作成し、スクリプトタグのsrc属性を使用して、任意のドメインでjsスクリプトを取得します。この機能(ループホールとも言えます)により、サーバー側はjson形式を返しませんが、特定を呼び出すための段落関数のjsコードはsrcで呼び出され、クロスドメインを実現します。

おすすめ

転載: blog.csdn.net/weixin_42120561/article/details/114704350