会話
セッション:我々は、セッションを呼び出すブラウザを処理するサーバーにアクセスするためにブラウザを開くために閉じてから、
ブラウザとサーバーの相互作用の間に、それは必然的にデータの一部を生成し、ユーザごとに対応するデータを保存するために、二つの技術使用:クッキーとセッションを。
クッキー
クライアント技術、サーバは、サーバがクライアントにデータを区別できるように、それは、関連するデータをもたらすでしょう、ユーザデータが再度アクセスする各クライアント、クッキーの形で書かれている送信します。
Javaクラスのクッキーはのjavax.servlet.http.Cookieによって作成され、その方法は提供されています。
クッキー(文字列名、文字列値); // その名前と値を渡して、Cookieオブジェクトをインスタンス化し 、パブリック文字列getNme(); // クッキーの名前を取得 公共の文字列のgetValueを(); //は、Cookieの値を取得 公共 ボイドのsetValueを( newValueに文字列); // クッキーの値に設定 公共 ボイド setMaxAge(INT有効期限を); // 設定されたCookieの最大蓄積時間 公共 int型 getMaxAge(); // 単位のクッキーの有効性を得ることが第2である 公共 のボイド SETPATHは(文字列URI)。// クッキーの有効なパスを設定し、アクセスした時にそのパスが構築されているクッキーの パブリック文字列のある、getPathは(); // クッキーの有効なパスを取得します 公共 ボイド setDomain(文字列パターン); // クッキーのドメインの有効設定 パブリック文字列getDomainを(); //は、クッキーの有効なドメインを取得
各ブラウザを使用するクッキーは、クッキーを設定し、要求としてクッキーを実施しているかどうかを確認されています。
インポートのjavax.servlet.http.Cookie。 PrintWriterアウト = resppnse.getWriter()。 クッキー[]クッキー =のrequest.getCookies()。 もし(!クッキー= ヌル){ のために(int型 I ++は、I = 0、私はcookies.lengthを< {) クッキークッキー = クッキー[i]は、 // 找到所要核对的cooki名 であれば(cookie.getName()に等しい( "lastaccesstime"。 )){ ロングlastaccesstime = Long.parseLong(cookie.getValue())。 日付日付 = 新しい日付(lastaccesstime)。 out.write(date.toLocaleString()); //日付形式の前にクッキーの値を変換して出力 } } } 他{ out.write(「サイトへの最初の訪問」); } クッキークッキー = 新しい新しいクッキー( 「lastacccesstime」、にSystem.currentTimeMillisは、()+「」); // 最初の訪問は、クッキーが現在時刻値に設定されているかどうかを response.addCookie(クッキー); //はに応答し、出力に新しいクッキーを追加しますクライアント
情報のみクッキーを識別する、すなわち、ウェブサイトがブラウザで複数のサイトに送信することができる、ブラウザは、異なる部位で格納することができるクッキーを同定しました。
あなたがgetMaxAgeを使用しない場合は()クッキーを使用すると、オリジナルのクッキー情報を見つけることができない、ブラウザを閉じて再度ログインすることを、その情報がメモリに保存されているハードドライブに保存されます。あなたはクッキーに0に設定されている自分の時間を削除するとき削除する同等。
これは中国語トランスコードを格納するのURLEncoderクラスコード(文字列の文字列ENC)メソッドを必要とします
クッキークッキー= 新しいクッキー( "名前"、URLEncoder.encode( "小兆"、 "UTF-8"));
URLEncoderクラスはまた、中国のクッキーをデコードするデコード取得(文字列の文字列ENC)が使用されます。
URLDecoder.decode(クッキー[I]以降.getvalue()、 "UTF-8");
セッション
各ユーザのブラウザサーバは、ユーザが他のプログラムにサーバーにアクセスしたときにユーザーデータの格納に使用Sessionオブジェクトを作成し、他のプログラムは、顧客サービスがあるため、ユーザーのセッションを介してユーザのデータから取り出すことができます。
主な違いは、クッキーを使用することです:あなたはのgetSessionセッションオブジェクトを取得するには、リクエストオブジェクトのメソッドを呼び出すために必要がある場合、セッションは、サーバーに存在している間クッキーは、ブラウザにアドレス指定されます。
それが作成されていない場合に存在する場合のgetSession()メソッドは自動的に、既存のセッションかどうかを決定する、呼び出され;そしてセッションは、自身のIDがブラウザにクッキーの形で送信される必要がありますのでのgetSession()メソッドが存在しなければなりませんセッションIDの作成とクッキーの手順をオブジェクトに渡します。
既存のセッションかどうかを確認します。
=セッションのHttpSession でrequest.getSession(); にsession.setAttribute( "データ"、 "小さな前駆体"); // 変更する必要があり、前述の文字コードを覚えている"8 UTF" 文字列セッションID = session.getId(); IF (セッション.isNew()){ response.getWriter()印刷( "正常に作成され、あるセッションID:" + セッションID); } 他{ response.getWriter()プリント(セッションIDである「セッションがすでに存在しています、 :「+ セッションID); }
デフォルトでは30分が使用されていないセッションオブジェクト、サーバーに自動的に破壊されたセッションは、手動でweb.xmlでセッションの有効期限を設定することができます。
<セッション設定> <セッションタイムアウト> 12 </セッションtiomeout> </セッション設定>
複数の送信フォームを防ぎます
クライアントの防止:
<%@ページ言語= "Javaの" インポート = "java.utilのクラス。*" pageEncodingは= "UTF-8" %> <!HTMLをDOCTYPE> <HTML> <HEAD> <TITLE> Form1フォーム</ TITLE> <スクリプトタイプ= "テキスト/ JavaScriptを"> varがisCommitted = falseに ; // フォームがfalseに識別子のデフォルトは提出されているかどうかを dosubmit機能(){ IF(== isCommitted falseに{) isCommittedは = trueに ; // フォームを提出した後、フォームかどうか提出アイデンティティがtrueに設定されている リターン をtrueに。//はtrueを返すように、通常のフォーム送信 } 他{ リターン 偽 ; // 返回偽那么表单将不提交 } } </ SCRIPT> </ head> <body> <フォームアクション= "$ {pageContext.request.contextPath} /サーブレット/ DoFormServlet"をonSubmit = "dosubmitを返す()"メソッド= "ポスト"> 用户名:の<input type = "text"の名= "ユーザ名"> の<input type = "提出"値= "提交" ID => "送信" </ FORM> </ BODY> </ HTML>
それは、その提出のJavaScriptの自体を使用して制御することができます。
サービスの終了を防止し、サーバは一意の識別子を生成し、トークントークンと呼ばれ、トークンは、ユーザーのセッションに保存され、フォームをフォームに送られますが、非表示のフォームを使用するフォーム
一緒にサーバーに送信提出し、その後、サーバーが同じで正常に送信された場合は、提出されたトークンとトークンに基づいてセッションを比較し、トークン情報は、セッションでの成功後に削除された場合、トークンフィールドは、格納します;サーバが見つからまたはフォームまたはトークンは、値が一致しない運ぶされていない場合は、フォームの送信を拒否。
固有の識別コードを生成し、セッションに格納されているために、そのページにジャンプxxx.jsp。
TokenProccessor.getInstanceトークン=文字列()makeToken();. // トークン作成 でrequest.getSessionを()のsetAttribute(、 "トークン"トークン);. // サーバにおけるトークン(トークン)セッションの保存を使用し request.getRequestDispatcher( " /xxx.jsp").forward(request、応答); // ページform.jspへジャンプ
Xxx.jspエディタページ、フォームから設定し、トークンを格納するための隠しフィールドを使用します。
<FORM ACTION = "$ {pageContext.request.contextPath} / XXX" METHOD = "POST">
の<input type = "隠れた" NAME = "トークン"値= "$ {トークン}" />
用户名: <入力タイプ= "text"の名= "ユーザ名">
の<input type = "提出"値= "提交">
</ FORM>
トークン比較値とフォーム提出アップセッション・オブジェクト・ストレージ・サーバは、処理要求か否かを判断します。
インポートにjava.io.IOException; 輸入javax.servlet.ServletException; 輸入javax.servlet.http.HttpServlet。 インポートのjavax.servlet.http.HttpServletRequest; インポートのjavax.servlet.http.HttpServletResponse; パブリック クラス DoFormServletは延びHttpServletを{ 公共 ボイドのdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答) スローServletExceptionがは、IOException { ブール B = isRepeatSubmit(要求)。// 判断用户是否是重复提交 場合(B == 真){ System.out.printlnは("送らないでください" )を、 返す; } でrequest.getSession()removeAttribute(。 "トークン"); // トークンセッション削除 するSystem.out.printlnを( "処理ユーザが要求を提出する!!" ); } / ** *トークンを生成し、クライアントとサーバーサイドアップトークンが提出した分析と同じされている * @paramのリクエストが * @return *リピートユーザーがtrueにフォームを送信する *リピートユーザーがfalseにフォームを送信しません * / プライベート ブールisRepeatSubmit(HttpServletRequestのリクエスト) { 文字列client_token = request.getParameter( "トークン" ); //フォームは、ユーザーが送信したデータトークンがない場合1は、ユーザがフォームを繰り返し送信 IF(client_token == NULL ){ 戻り trueに; } // トークンを削除し、セッションに格納されている (文字列server_token =(文字列)でrequest.getSession ).getAttribute( "トークン" ); // 2、トークン(トークン)セッション、現在のユーザが存在しない場合、ユーザーがフォームを繰り返す送信 IF(server_token == NULL ){ リターン trueに; } // 。3、フォーム送信とセッショントークントークン(トークン)(トークン)が異なるに格納され、ユーザがフォームを繰り返し送信 IF(!{client_token.equals(server_token)) リターン trueにします。 } を返す 偽。 } 公共 ボイドのdoPost(HttpServletRequestのリクエスト、HttpServletResponseの応答)は スローServletExceptionがは、IOException { doGetメソッド(要求、応答)。 } }
その一意性を保証するために、私たちが所有することができます実現する方法を作成するためのトークンの前には、