フィルタチェーンの実行順序は何によって決まりますか?

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