ホームページ >ウェブフロントエンド >jsチュートリアル >Ajaxアクセスで常に変化するセッションの値の不一致とHTTPプロトコルのGETとPOSTの違いを解決する方法
この記事では主に、Ajax アクセスにおけるセッションの変更値の不一致の解決策と、HTTP プロトコルの GET と POST の違いに関する関連情報を紹介します。必要な友人はそれを参照してください
今日私が遭遇したときに遭遇しました。プログレスバーを作成していました。 1つの質問は、データがクロールされると値が+1され、フロントデスクが3秒ごとにセッションの値を取得するカウンターを保存しましたが、問題が発生します。 FF では、取得された値はすべて正常ですが、IE では、ページを再度開いた場合にのみ、前の値が同じままになります:
以下は私の proBar.jsp のコードです:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <script type="text/javascript" src="<%=path %>/js/jquery.js"></script> <script type="text/javascript" src="<%=path%>/js/jquery.progressbar.min.js"></script> <script type="text/javascript"> function createXMLHttpRequest() { var xmlHttp; if (window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else { xmlHttp = new XMLHttpRequest(); } return xmlHttp; } function btn_click() { var xmlHttp; xmlHttp = createXMLHttpRequest(); xmlHttp.onreadystatechange = processor; //xmlHttp.open("GET", "/jbbs/servlet/ControlCrawl?method=getinforsize", true); xmlHttp.open("POST", "/jbbs/servlet/ControlCrawl?method=getinforsize", true); xmlHttp.send(null); function processor() { ....... } } var action=setInterval("btn_click();", ); </script> <span>爬取进度:</span><br/> <p id="container"></p>
その後、GETをPOSTに変更したら正常になりました。
追記: HTTP GET と POST について
HTTP では、サーバーと対話するためのさまざまなメソッドが定義されており、GET、POST、PUT、DELETE という 4 つの最も基本的なメソッドがあります。 URL の完全な名前はリソース記述子です。URL アドレスはネットワーク上のリソースを記述するために使用され、HTTP の GET、POST、PUT、DELETE は検索、変更、追加に相当します。このリソースの 4 つの操作を削除します。 この時点で、GET は一般にリソース情報の取得/クエリに使用され、POST は一般にリソース情報の更新に使用されることを一般的に理解する必要があります。
1. HTTP 仕様によれば、GET は情報取得に使用され、安全かつ冪等である必要があります。
(1). いわゆる安全とは、操作が情報を変更するのではなく、情報を取得するために使用されることを意味します。言い換えれば、GET リクエストには通常、副作用があってはなりません。つまり、データベース クエリと同様に、リソース情報を取得するだけであり、データの変更や追加は行われず、リソースのステータスには影響しません。
* 注: ここでのセキュリティの意味は、変更されていない情報のみを指します。
(2)。冪等とは、同じ URL に対する複数のリクエストが同じ結果を返すことを意味します。
インポテンス (冪等、冪等) は、抽象代数でよく見られる数学またはコンピューターサイエンスの概念です。
インポテンスには次の定義があります:
単項演算の場合、範囲内のすべての数値に対して演算を複数回実行した場合、その演算を複数回実行して得られる結果は、その演算を実行して得られる結果と同じになります。 1 回の場合、操作は冪等であると言います。例えば、絶対値演算は、実数の集合において、abs(a)=abs(abs(a))となる。
両眼演算の場合、演算に参加する 2 つの値が等しいとき、演算結果が演算に参加する 2 つの値と等しい場合、その演算は冪等 (2 つの数値の最大値を求めるなど) 値の関数は実数のセット内で冪等です (max(x,x) = x)。
しかし、実際の適用では、上記の 2 つの規制はそれほど厳格ではありません。他人の記事を引用する例: たとえば、ニュース サイトのトップページは常に更新されます。 2 番目のリクエストは別のニュースのバッチを返しますが、常に最新のニュースを返すため、この操作は安全で冪等であると考えられます。基本的に、ユーザーがリンクを開いたときに、ユーザーの観点からリソースが変更されていないことを確認することが目標である場合、ユーザーはリソースが変更されていないことを確認できます。
2. HTTP 仕様によれば、POST はサーバー上のリソースを変更する可能性のあるリクエストを表します。
引き続き上記の例を引用します。ニュース Web サイトを例に挙げます。ニュースに対する読者のコメントは、POST を通じて実装される必要があります。これは、コメントが送信された後、サイトのリソースが異なるためです。変更されています。
しかし、実際にそれを行う場合、多くの人は HTTP 仕様に従っていません。次のような理由があります。 GETではなく、POSTはFORM(フォーム)に行かなければいけないので、少し面倒になります。
2. リソースの追加、削除、変更、確認は実際には GET/POST によって完了でき、PUT や DELETE を使用する必要はありません。 3. もう 1 つは、初期の Web MVC フレームワークの設計者は URL を抽象リソースとして意識的に扱って設計していなかったことです。そのため、より深刻な問題は、従来の Web MVC フレームワークは基本的に 2 つの HTTP メソッドである GET と POST のみをサポートしていましたが、PUT と DELETE はサポートしていたことです。メソッドはサポートされていません。* MVC について:
MVC はもともとデスクトップ プログラムに存在していました。M はデータ モデルを指し、V はユーザー インターフェイスを指し、C はコントローラーを指します。 MVC を使用する目的は、M と V の実装コードを分離し、同じプログラムで異なる表現を使用できるようにすることです。
上記の 3 つの点は、一般に古いスタイル (HTTP 仕様に厳密に準拠していない) を説明していますが、アーキテクチャの発展に伴い、HTTP 仕様をサポートする新しいスタイルである REST (RepresentationalState Transfer) が登場します。詳細については、「RESTful Web サービス」を参照してください。GET と POST の違いを表面から見てみましょう:
(1) まず、「GET で送信できるデータは 1024 バイトまでです」。GET は URL を通じてデータを送信するため、GET で送信できるデータの量は URL の長さに直接関係します。 。実際、URL にはパラメータの上限がなく、HTTP プロトコル仕様では URL の長さを制限しません。この制限は、特定のブラウザとサーバーによって課されます。 IE の URL の長さの制限は 2083 バイト (2K+35) です。 Netscape、FireFox などの他のブラウザの場合、理論上長さの制限はなく、制限はオペレーティング システムのサポートによって異なります。この制限は、パラメータ値のデータ長だけではなく、URL 全体の長さであることに注意してください。
(2). 理論的には、POST にはサイズ制限はなく、HTTP プロトコルの仕様でも「POST データ量には 80K/100K のサイズ制限がある」と言うのは不正確です。 POST データに制限はありません。制限要因はサーバーのハンドラーの処理能力です。
ASP プログラムの場合、各フォーム フィールドを処理する際の Request オブジェクトのデータ長制限は 100K です。ただし、Request.BinaryRead を使用する場合、そのような制限はありません。
これを拡張して、IIS 6.0 に関して、Microsoft はセキュリティ上の理由から制限を強化しました。
次の点にも注意する必要があります:
1) IIS 6.0 のデフォルトの ASP POST データ量は最大 200 KB で、各フォーム フィールドの制限は 100 KB です。
2) IIS 6.0 でアップロードされるファイルのデフォルトの最大サイズは 4MB です。
3) IIS 6.0 のデフォルトの最大要求ヘッダーは 16 KB です。
IIS 6.0 より前には、そのような制限はありませんでした。
つまり、上記の 80K と 100K は単なるデフォルト値かもしれません (注: IIS4 と IIS5 のパラメーターはまだ確認していません) が、間違いなく自分で設定できます。 IIS の各バージョンにはこれらのパラメータのデフォルト値が異なるため、詳細については関連する IIS 構成ドキュメントを参照してください。
3. ASP では、サーバーは Request.QueryString を使用して GET リクエスト パラメーターを取得し、Request.Form を使用して POST リクエスト パラメーターを取得します。
JSPでは、request.getParameter("XXXX")を使用して取得します。 jspにはrequest.getQueryString()メソッドもありますが、使用するのはさらに面倒です。 name=hyddd&password=hyddd 、 request.getQueryString() を使用して name=hyddd&password=hyddd を取得します。 PHP では、$_GET と $_POST を使用して、それぞれ GET と POST でデータを取得できますが、$_REQUEST は GET リクエストと POST リクエストの両方でデータを取得できます。 JSP での request や PHP での $_REQUEST の使用には危険が潜んでいることに注意してください。次回はその概要を記事にします。
4.POST は GET よりも安全です。
注: ここで説明するセキュリティは、上記の GET で説明した「セキュリティ」とは同じ概念ではありません。上記の「セキュリティ」の意味は、データの変更が行われないことだけであり、ここでのセキュリティの意味は、セキュリティの本当の意味です。たとえば、GET 経由でデータを送信する場合、ユーザー名とパスワードは URL にクリア テキストで表示されます。なぜなら、(1) ログイン ページがブラウザ キャッシュである可能性があり、(2) 他の人がブラウザ履歴を閲覧すると、他の人があなたのアカウントとパスワードを取得する可能性があるためです。さらに、GET を使用してデータを送信すると、クロスサイト リクエスト フォージェリ攻撃が発生する可能性もあります。
要約すると、Get はサーバーへのデータのリクエストであり、Post はサーバーへのデータの送信リクエストです。FORM (フォーム) では、メソッドのデフォルトは「GET」です。送信メカニズムは異なります。一方が取得され、一方が送信されるわけではありません。
上記は私があなたのためにまとめたものです。
関連記事:
MVCにAjaxとHTML5に基づくファイルアップロード機能を実装する
Google Chromeブラウザでのajax障害を解決する方法
ajaxに基づいてクリックロードを実装するこのページを更新しないでロードする
以上がAjaxアクセスで常に変化するセッションの値の不一致とHTTPプロトコルのGETとPOSTの違いを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。