フィルターと提出し、繰り返し使用するJavaベースのセッションページを防ぐ
ソリューション:
1.フォームページのユーザーのアクセスを、最初のフィルターを通して、フィルタはトークントークンランダムIDと非表示のフォームフィールドにトークンとして提供されている
形式に対応して2 、ブラウザは、ユーザがデータを充填するための要求を提出
;、フィルターを通して3つの要求フォーム取得した認証トークンのフィルタ、以前にトークンと一貫した生成した場合、要求は解放され、トークンをクリア
繰り返しユーザ場合4フォームは、最初の障害は、インターフェースに警告するために、トークン一貫性のない、リリースジャンプを空になった後にトークンが解放されるため、フィルタが検証され、フィルタを介して、要求を提出しています。
知識必須:
基本フィルタ1つの
基本サーブレット2
3基本フィルタ。
4 JSPの基礎
のためのコード
1 JSPフォームフォームページを達成
<%は、ページの言語@ = "javaの" contentTypeの= "text / htmlの;のcharset = UTF-8" pageEncodingは= "UTF-8" %> <!DOCTYPE HTML> <HTML> <HEAD> <メタ文字コード= "UTF-8 "> <タイトル>ここで挿入タイトル</ TITLE> </ HEAD> <BODY> <フォームアクション="ログイン」メソッド= "ポスト"> <! -利用表单的隐藏域保存トークン令牌- > <! 。 - $ {トークン}等价于req.getsession()のgetAttribute( "トークン") - > の<input type = "隠れた" NAME = "トークン"値= "$ {トークン}" /> 用户名:<入力タイプ= "テキスト"名前= "ユーザ名" /> <BR/> 密码:の<input type = "パスワード"名前=」パスワード"/> <BR/> <入力タイプ="提出」値= "ログイン" /> </ FORM> </ BODY> </ HTML>
2つのフィルタフィルタ
パッケージcom.woniu.filter.controler。 インポートにjava.io.IOException; 輸入java.util.UUID。 インポートは、javax.servlet.Filter; 輸入れるjavax.servlet.FilterChain。 インポートするjavax.servlet.FilterConfig。 輸入javax.servlet.ServletException; 輸入javax.servlet.ServletRequest; インポートのjavax.servlet.ServletResponse。 輸入javax.servlet.annotation.WebFilter。 インポートのjavax.servlet.http.HttpServletRequest; インポートのjavax.servlet.http.HttpServletResponse; / ** *サーブレットフィルタの実装クラスTokenFilte * / //过滤所有サーブレット @WebFilter( "*") publicクラスTokenFilteはフィルター{実装 公共TokenFilteを(){ // TODO自動生成コンストラクタスタブ } 公共ボイドのdoFilter(のServletRequest要求、ServletResponseを応答、れるFilterChain鎖)にIOException、ServletExceptionが{スロー // TODO自動生成方法スタブ //设置编码集 request.setCharacterEncoding( "UTF-8") ; response.setCharacterEncoding( "UTF-8"); response.setContentType( "テキスト/ HTML; charser = UTR-8")。 //向下转型 のHttpServletRequest REQ =(HttpServletRequestの)要求。 HttpServletResponseのRESP =(HttpServletResponseの)応答。 //获取表单的トークン 文字列parameterToken = req.getParameter( "トークン"); //获取セッション中的トークン 文字列はsessionToken =(String)をreq.getSession()。のgetAttribute(」 //トークンの形を決定し、ユーザーがフォームを送信するために空のフォームのために何の説明を持っていない、あなたは、重複して提出するかどうかを確認する必要があります 。//空のノートは、ログインページを入力するのは初めてで、あなたがトークンを設定する必要が IF(ParameterTokenを!= NULL){ //裁判官2つのトークンは、等しい等しい、解放され、トークンをリセット (parameterToken.equals(はsessionToken))場合{ //トークンがリセット req.getSession()removeAttribute( "トークン");. chain.doFilter(要求応答); } //注他{プロンプトページに転送され、再送信し req.getRequestDispatcher(「repeatReminder」)フォワード(リクエスト、レスポンス);. } トークンを設定する必要が最初に他{//} / /宇宙はユニークコード生成 トークン= UUID.randomUUID()のtoString();.文字列 //セッションを設定 req.getSession()のsetAttribute( "トークン"トークン);. //放出 ; chain.doFilter(リクエスト、レスポンス) } } @Override 公共ボイド(破棄)は{ // TODO自動生成方法スタブ } @Override 公共ボイドのinit(に、FilterConfigに、FilterConfig)はServletExceptionがをスロー{ // TODO自動生成方法スタブ } }
サーブレット3つの形応答
30秒間スリープ状態にスレッドを使用して、アナログネットワーク輻輳
パッケージcom.woniu.filter.controler。 インポートにjava.io.IOException; 輸入javax.servlet.ServletException; 輸入javax.servlet.annotation.WebServlet; 輸入javax.servlet.http.HttpServlet。 インポートのjavax.servlet.http.HttpServletRequest; インポートのjavax.servlet.http.HttpServletResponse; / ** *サーブレット実装クラスPrintUser * / @WebServlet( "/ログイン") パブリッククラスログインHttpServletを拡張{ プライベート静的最終長いのserialVersionUID = 1L。 パブリックログイン(){ スーパー(); // TODO自動生成されたコンストラクタスタブ } 保護されたボイドのdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答)がServletExceptionががスロー、IOExceptionが{ 試みる{ //线程睡30秒、便于演示网络拥堵 のThread.sleep(30000)。 response.getWriter()書き込み( "登录成功")。 }キャッチ(InterruptedExceptionある電子){ // TODO自動生成キャッチブロック e.printStackTrace(); } } 保護されたボイドのdoPost(HttpServletRequestのリクエスト、HttpServletResponseの応答)ServletExceptionがは、IOException {スロー のdoGet(要求、応答)。 } }
4重複提出のサーブレットの応答時間
提出するページを繰り返しリマインダにジャンプします
パッケージcom.woniu.filter.controler。 インポートにjava.io.IOException; 輸入javax.servlet.ServletException; 輸入javax.servlet.annotation.WebServlet; 輸入javax.servlet.http.HttpServlet。 インポートのjavax.servlet.http.HttpServletRequest; インポートのjavax.servlet.http.HttpServletResponse; / ** *サーブレット実装クラスrepeatReminder * / @WebServlet( "/ repeatReminder") パブリッククラスrepeatReminderはHttpServletを拡張{ プライベート静的最終長いのserialVersionUID = 1L。 パブリックrepeatReminder(){ スーパー()。 // TODO自動生成されたコンストラクタのスタブ } 保護されたボイドのdoGet(HttpServletRequestのリクエスト、HttpServletResponseの応答)ServletExceptionがは、IOException {スロー response.getWriterを()( "页面正在处理、请勿重复提交")を書き込みます。 } ボイドのdoPost(HttpServletRequestのリクエスト、HttpServletResponseの応答)を保護ServletExceptionがは、IOExceptionがスロー{ // TODO自動生成方法のスタブ のdoGet(リクエスト、レスポンス)。 } }