【バイトアリテンセントインタビュー乾物】3回の握手、2回はできない?あなたが誤って間違えたという知識はここにまとめられています!

2020年の最新のJavaコレクションの一般的なインタビューの質問+詳細な回答(7)

最近、周りの多くの人が大きな工場へのインタビューについて質問してきました。そのため、私は自分と友人のインタビューの質問を組み合わせて、一般的で基本的なJavaのインタビューの質問を整理しています。最初のいくつかのコレクションはホームページに投稿されています。

答えのいくつかは私自身によって要約され、いくつかはインターネット上で収集されます。これらのインタビューを見た後、慌てないでください!もっと経験があればコメント欄でシェアしてください。間違いがあれば教えてください。教えてください、ありがとうございます〜

インターネット

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

 

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

 

違い: 

 

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

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

 

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

 

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

 

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

 

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

 

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

  

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

  

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


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

 

  • TCPは接続指向です(電話をかける前に接続を確立するためにダイヤルするなど)。UDPは接続がありません。つまり、データを送信する前に接続を確立する必要はありません。

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

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

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

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

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

 

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

 

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

 

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

65. OSIの7層モデルとは何ですか?

 

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

  2. プレゼンテーションレイヤー:データのプレゼンテーション、セキュリティ、および圧縮。

  3. セッションレイヤー:セッションを確立、管理、および終了します。

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

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

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

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

 

66.リクエストの取得と投稿の違いは何ですか?

 

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

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

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

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

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

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

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

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

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

あなたが良い記憶を持っているかどうか見てみましょう

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

 

方法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つ以上追加する必要があります。

 

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400

 

クロスドメインリクエストは、デフォルトではCookie情報を伝達しません。伝達する必要がある場合は、次のパラメーターを構成してください。

 

"Access-Control-Allow-Credentials": true
// Ajax设置
"withCredentials": true

 

方法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に注意してください。エラーが報告されます。

 

起点「http:// localhost:10001」のフレームが起点「http:// localhost:10000」のフレームにアクセスするのをブロックしました。プロトコル、ドメイン、およびポートは一致する必要があります。

 

 

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

 

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

 

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

 

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

現在、aaa.xxx.comとbbb.xxx.comの2つのドメイン名があります。aaaの下にbbbが埋め込まれているページ。document.namesに一貫性がないため、bbbのjsをaaaの下で操作することはできません。document.name = 'xxx.com';を設定して、相互アクセスを実現するために、jsを介してaaaおよびbbbで一貫性を保つことができます。

 

方法7:WebSocket

 

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

 

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

 

方法8:代理店

 

同じ起源のポリシーはブラウザ側の制限であり、サーバー側で解決できます

 

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

 

出典:blog.csdn.net/ligang2585116/article/details/73072868

 

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

 

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

やっと

面接の質問の内容はこちらですので、皆様のお役に立てれば幸いです。

最後に、私はあなたに何かを言いたいと思います。私は長年働いて、他の人のために何人かの人々にインタビューしました。面接官またはリーダーの観点からであろうとなかろうと、面接のスキルと経験に加えて、優れた技術とプロジェクトの経験も彼らの切り札と自信です。一流メーカーのコアテクノロジー共有

 教材を整理するのに時間がかかりました。上に投稿したのは、教材の氷山の一角です。お役に立てれば幸いです。クリックして一緒に暗号を学ぶ:csdn

                         

  フォローアップでより純粋な乾物の記事を共有し、本当にあなたを助けたいと思っています。あなたのサポートが私の最大の動機です!

おすすめ

転載: blog.csdn.net/weixin_50333534/article/details/108805134