フィルターを使用してJavaベースのセッションとの重複申請ページを防ぎます

フィルターと提出し、繰り返し使用する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(リクエスト、レスポンス)。
	} 

}

  

おすすめ

転載: www.cnblogs.com/xiaobozhi/p/11604490.html