フィルタチェーンの実行順序は何によって決まりますか?
3304 ワード
フィルタは、Webサイト内の様々なコンテンツ(ページ、サーブレット、ピクチャ、ファイル)をフィルタリングし、Webサイトのコンテンツリクエストや応答時にいくつかの操作を行い、共通の機能を完了することができます.
フィルタチェーン
プロジェクトに複数のフィルタを作成できます.Webサイトの内容は複数のフィルタを通過する可能性があります.複数のフィルタがフィルタチェーンを形成します.
画像1
実装方法:
1、Filterインタフェースを実現する
初期化
フィルター
パラメータ:
サーブレットリクエスト
サーブレットResponseレスポンス
FilterChainフィルタチェーン
//リクエストを通過させ、次のフィルタを実行し、このメソッドを実行しないとリクエストがブロックされます
chain.doFilter(request, response);
destroy破棄
2、配置
web.xml
Filter1
com.qianfeng.filters.Filter1
Filter1
/*
*は、すべてのWebサイトのコンテンツがこのフィルタを通過していることを意味し、フィルタされたコンテンツを指定できます.
/test1.jsp
/test2.jsp
注記:
フィルタの実行順序:
注記構成の場合は、名前順に実行します.
Webならxml構成の、フィルタフィルタ定義のゲーム順
ケース:フォームの重複コミットの問題
フォームデータをサーバに複数回コミット
問題:1、サーバーの負担を大きくする2、重複データを複数回挿入する
重複コミットの場合:
1、フォームを提出した後、forwardで他のページにジャンプし、ページをリフレッシュする
2、フォームを提出した後、サーバーが応答する前に、何度もページを更新する
3、フォームを提出した後、サーバーが応答する前に、何度も提出ボタンをクリックする
4、フォームを提出した後、ジャンプした後、クリックして戻って、クリックして提出する
解決方法:
1.フォームページに入る前に、フィルタにToken(トークン)ランダム文字列を作成し、Sessionに保存します.
2、フォームに隠しドメインを追加します.値はToken文字列で、フォームと一緒にサーバーを提出します.
3、サーバーを提出した後、フォームのTokenとSessionのTokenを比較し、同じ場合は正常にフォームを提出し、そうでない場合は繰り返し提出する.
4、提出に成功したら、セッション中のTokenを削除します.
/**
*トークンを生成するフィルタ
*/
public class TokenFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//ランダム文字列の生成
String token = UUID.randomUUID().toString();
//セッションに保存
HttpServletRequest res = (HttpServletRequest) request;
res.getSession().setAttribute("token", token);
//後のフィルタの実行
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {}
public void destroy() {}
}
/**
*アナログデータのサーブレット追加
*/
public class AddUserServlet extends HttpServlet{
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//フォームのtokenがセッションのtokenと同じかどうかを判断する
String token1 = (String) req.getSession().getAttribute("token");
String token2 = req.getParameter("token");
if(!token1.equals(token2)){
//異なる場合は重複提出
System.out.println(「これは重複コミット」);
return;
}
String name = req.getParameter("name");
String age = req.getParameter("age");
//アナログコード、データベースの挿入に成功
System.out.println(name+","+age+"データベースに挿入");
//セッションのtokenを外す
req.getSession().setAttribute("token", "");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
req.getRequestDispatcher("test.jsp").forward(req, resp);
}
JSPページ:
pageEncoding="UTF-8"%>
ontent-Type"content="text/html; charset=UTF-8">
Insert title here
フィルタチェーン
プロジェクトに複数のフィルタを作成できます.Webサイトの内容は複数のフィルタを通過する可能性があります.複数のフィルタがフィルタチェーンを形成します.
画像1
実装方法:
1、Filterインタフェースを実現する
初期化
フィルター
パラメータ:
サーブレットリクエスト
サーブレットResponseレスポンス
FilterChainフィルタチェーン
//リクエストを通過させ、次のフィルタを実行し、このメソッドを実行しないとリクエストがブロックされます
chain.doFilter(request, response);
destroy破棄
2、配置
web.xml
Filter1
com.qianfeng.filters.Filter1
Filter1
/*
*は、すべてのWebサイトのコンテンツがこのフィルタを通過していることを意味し、フィルタされたコンテンツを指定できます.
/test1.jsp
/test2.jsp
注記:
フィルタの実行順序:
注記構成の場合は、名前順に実行します.
Webならxml構成の、フィルタフィルタ定義のゲーム順
ケース:フォームの重複コミットの問題
フォームデータをサーバに複数回コミット
問題:1、サーバーの負担を大きくする2、重複データを複数回挿入する
重複コミットの場合:
1、フォームを提出した後、forwardで他のページにジャンプし、ページをリフレッシュする
2、フォームを提出した後、サーバーが応答する前に、何度もページを更新する
3、フォームを提出した後、サーバーが応答する前に、何度も提出ボタンをクリックする
4、フォームを提出した後、ジャンプした後、クリックして戻って、クリックして提出する
解決方法:
1.フォームページに入る前に、フィルタにToken(トークン)ランダム文字列を作成し、Sessionに保存します.
2、フォームに隠しドメインを追加します.値はToken文字列で、フォームと一緒にサーバーを提出します.
3、サーバーを提出した後、フォームのTokenとSessionのTokenを比較し、同じ場合は正常にフォームを提出し、そうでない場合は繰り返し提出する.
4、提出に成功したら、セッション中のTokenを削除します.
/**
*トークンを生成するフィルタ
*/
public class TokenFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//ランダム文字列の生成
String token = UUID.randomUUID().toString();
//セッションに保存
HttpServletRequest res = (HttpServletRequest) request;
res.getSession().setAttribute("token", token);
//後のフィルタの実行
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {}
public void destroy() {}
}
/**
*アナログデータのサーブレット追加
*/
public class AddUserServlet extends HttpServlet{
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//フォームのtokenがセッションのtokenと同じかどうかを判断する
String token1 = (String) req.getSession().getAttribute("token");
String token2 = req.getParameter("token");
if(!token1.equals(token2)){
//異なる場合は重複提出
System.out.println(「これは重複コミット」);
return;
}
String name = req.getParameter("name");
String age = req.getParameter("age");
//アナログコード、データベースの挿入に成功
System.out.println(name+","+age+"データベースに挿入");
//セッションのtokenを外す
req.getSession().setAttribute("token", "");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
req.getRequestDispatcher("test.jsp").forward(req, resp);
}
JSPページ:
pageEncoding="UTF-8"%>
ontent-Type"content="text/html; charset=UTF-8">
Insert title here