JAvaWEB学習のフィルタ

6397 ワード

JavaWeb三大コンポーネント
1.すべてwebで必要です.xmlでのサーブレットListenerの構成
Filter
2.フィルタはwebを通過する.xmlはリソースのセット(jsp、servlet、.css、.htmlなど)の前で実行される大きなリソースを管理しています.管理するリソースにアクセスしたい場合は、処理をブロックします.リクエストにターゲットリソースを取得させることも、リクエストを達成させないこともできます.警備員のように多くのリソースを操作する限りfilterを思い浮かべるべきです
 
フィルタの作成方法
1.クラス実装Filterインタフェース2を書く.Webでxmlで構成管理するリソース
 
1.Filterインタフェース
    public void doFilter(ServletRequest request, ServletResponseresponse,
           FilterChain chain) throws IOException, ServletException{
       System.out.println("filterstart..."); 
       chain.doFilter(request,response);//   
       System.out.println("filterend..."); 
    }

 
void init(FilterConfig)*作成後、すぐに実行します.Filterはサーバの起動時に作成されます!void destory(*)*破棄する前に実行!サーバのシャットダウン時にvoid doFilter(サーブレットRequest,サーブレットResponse,FilterChain)を破棄*フィルタリングするたびに実行
Filterは一例です!servletと同じ
 
2. web.xml  xxx  web.filter.AFitler  xxx  /*
この構成は、このfilterが管理するリソースを表す.これらのリソースにアクセスすると、このフィルタはdoFilter()を実行します.
FilterConfig-->ServiceletConfigに似ています*初期化パラメータの取得:getInitParameter()*取得フィルタ名:getFilterName()*取得application:getServiceletContext()
FilterChain*doFilter(サーブレットリクエスト、サーブレットResponse):ロー!ターゲットサーブレットを呼び出したサービス()メソッドに相当します!
-------------------------------
-------------------------------
マルチフィルタの場合FilterChainのdoFilter()メソッド:ターゲットリソースを実行するか、次のフィルタを実行します!次のフィルタがない場合はターゲットリソースを実行し、ある場合は次のフィルタを実行します.
-------------------------------
フィルタの4種類のブロック方式
REQUESTデフォルト!ブロッキングダイレクトリクエストFOrWARDブロッキングリクエスト転送INCLUDEブロッキングリクエストはERRORブロッキングエラー転送を含む
で構成!
-------------------------------
複数のフィルタの実行順序
の構成順序がフィルタの実行順序を決定します!
 
フィルタの適用シーン:
ターゲットリソースを実行する前に前処理を行います.例えば、符号化を設定します.このような試みは通常、ターゲットリソースが実行される前に準備をします.
現在のユーザがログインしているかどうか、またはユーザIPが無効になっているかどうかを確認するなど、条件によってローを実行するかどうかを判断する.
ターゲットリソースの実行後、ターゲットリソースから出力されたデータを処理するなど、後続の特殊な処理を行います.
 
例:
統計IP
サーブレットContext内のmapをループします.keyはipアドレス、valueはアクセス回数です.
jspページ
<body>
<h1> IP      </h1>
<table align="center"width="50%" border="1">
    <tr>
       <th>IP  </th>
       <th>  </th>
    </tr>
<c:forEach items="${aplicationScope.ipCountMap}" var="entry">
    <tr>
       <td>${entry.key }</td>
       <td>${entry.value }</td>
    </tr>
</c:forEach>
 </table>  
</body>

フィルタコード
public void init(FilterConfig fConfig) throws ServletException {
       context = fConfig.getServletContext();
       Map<String, Integer> ipCountMap = new LinkedHashMap<String, Integer>();
       context.setAttribute("ipCountMap", ipCountMap);
    }
 
  public void doFilter(ServletRequest request, ServletResponseresponse,
           FilterChain chain) throws IOException, ServletException{
       HttpServletRequest req = (HttpServletRequest) request;
       String ip = req.getRemoteAddr();
 
       Map<String, Integer> ipCountMap = (Map<String,Integer>) context
              .getAttribute("ipCountMap");
 
       Integer count = ipCountMap.get(ip);
       if (count == null) {
           count = 1;
       } else {
           count += 1;
       }
       ipCountMap.put(ip, count);
 
       context.setAttribute("ipCountMap", ipCountMap);
       chain.doFilter(request, response);
    }
 
    public void destroy() {}
}

 
全局文字の文字化けしを解決する
文字化けしの問題:
l要求パラメータにおける乱符号化問題を取得する.
POST要求:request.setCharacterEncoding(“utf-8”);
GET要求:newString(request.getParameter(「xxx」)getBytes(“iso-8859-1”), “utf-8”);
l応答の文字化けし問題:response.setContextType(“text/html;charset=utf-8”).
POST要求の処理は簡単であるが、get要求の処理にはパラメータを取得する必要があり、filterがすべてのフィルタリングリソースのパラメータを取得することは不可能である.ここでrequestをパッケージしてservletに送ることができます.requestオブジェクト(getParamater()メソッドを変更する.パラメータを取得するたびに文字化けし問題を直接解決する).
オブジェクトを強化する方法は3つあります:(aオブジェクトを強化し、fun 1()方法)
  • 継承:AAクラスはaオブジェクトのタイプ:Aクラスを継承し、fun 1()メソッドを書き換え、書き換えたfun 1()メソッドが強化されたメソッドである.ただし、継承は、aオブジェクトの真のタイプを知ってから継承する必要があります.aオブジェクトの正確なタイプを知らず、aオブジェクトがIAインタフェースの実装クラスオブジェクトであることしか知らない場合、継承を使用してaオブジェクトを強化することはできません.
  • 装飾者モード:AA類はaオブジェクトの同じインタフェースを実現する:IAインタフェース、またAA類にaオブジェクトを伝達する必要があり、AA類のすべての方法の実現はaオブジェクトを呼び出す同じ方法で実現され、fun 1()方法だけが下の内容を変更し、fun 1()を強化する必要がある.
  • 動的エージェント:エンハンダーモードと比較して
  • に似ています.
    ここでrequestオブジェクトを補強するのは、requestオブジェクトの装飾クラスを継承することにより、装飾クラスはインタフェースの包装クラスであるが、補強は一切行われず、それを継承してから補強が必要な方法を書き換えることにより、補強が必要な方法を書き換える必要がなくなる.
     
    (強化時に継承類を見ると、インタフェースのある包装類、三インタフェースの装飾者モードを見る)
    public class EncodingFilter implements Filter {
     public void destroy() {
     }
     public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
      //   post      
      request.setCharacterEncoding("utf-8");
      
      HttpServletRequest req = (HttpServletRequest) request;
      
      /*
       *   GET       
       */
    //  String username = request.getParameter("username");
    //  username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
      
      /*
       *   request
       */
      if(req.getMethod().equals("GET")) {
       EncodingRequest er = new EncodingRequest(req);
       chain.doFilter(er, response);
      } else if(req.getMethod().equals("POST")) {
       chain.doFilter(request, response);
      }
     }
     public void init(FilterConfig fConfig) throws ServletException {
     }
    }

    継承パッケージクラス強化request
    /**
     *   reqeust
     */
    public class EncodingRequest extends HttpServletRequestWrapper {
     private HttpServletRequest req;
     
     public EncodingRequest(HttpServletRequest request) {
      super(request);
      this.req = request;
     }
     public String getParameter(String name) {
      String value = req.getParameter(name); 
      //       
      try {
       value = new String(value.getBytes("iso-8859-1"), "utf-8");
      } catch (UnsupportedEncodingException e) {
       throw new RuntimeException(e);
      } 
      return value;
     }
    }