Filter(过滤器)
一、Filter過濾器(重要)
     Javaweb中的過濾器可以攔截所有訪問web資源的請求或響應操作。
  1、Filter快速入門
     1.1、步驟:
      1. 創建一個類實現Filter接口
      2. 重寫接口中方法 doFilter方法是真正過濾的。
      3. 在web.xml文件中配置
     ?注意:在Filter的doFilter方法內如果沒有執行chain.doFilter(request,response)
        那么資源是不會被訪問到的。
    1.2、FilterChain
      FilterChain 是 servlet 容器為開發人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。
      過濾器使用 FilterChain 調用鏈中的下一個過濾器,如果調用的過濾器是鏈中的最后一個過濾器,則調用鏈末尾的資源。
         只要多個Filter對同一個資源進行攔截就可以形成Filter鏈
         由<filter-mapping>來確定
     1.3、Filter生命周期
      類似于Servlet生命周期:
        實例化 --》 初始化 --》 服務 --》 銷毀
      ?當服務器啟動,會創建Filter對象,并調用init方法,只調用一次.
?      當訪問資源時,路徑與Filter的攔截路徑匹配,會執行Filter中的doFilter方法,這個方法是真正攔截操作的方法.
      ?當服務器關閉時,會調用Filter的destroy方法來進行銷毀操作.
     1.4、FilterConfig
       在Filter的init方法上有一個參數,類型就是FilterConfig.
       FilterConfig它是Filter的配置對象,它可以完成下列功能
        1. 獲取Filter名稱
        2. 獲取Filter初始化參數
        3. 獲取ServletContext對象。
    1.5、Filter配置
       基本配置:
         <filter>
           <filter-name>filter名稱</filter-name>
           <filter-class>Filter類的包名.類名</filter-class>
         </filter>
         <filter-mapping>
           <filter-name>filter名稱</filter-name>
           <url-pattern>路徑</url-pattern>
         </filter-mapping>
       關于其它配置:
         1.<url-pattern>
           完全匹配   以”/demo1”開始,不包含通配符*
           目錄匹配   以”/”開始 以*結束
           擴展名匹配 ? *.xxx 不能寫成/*.xxx
         2.<servlet-name>
           它是對指定的servlet名稱的servlet進行攔截的。
         3.<dispatcher>
           可以取的值有 REQUEST FORWARD ERROR INCLUDE 
          它的作用是:當以什么方式去訪問web資源時,進行攔截操作. 
            1.REQUEST 當是從瀏覽器直接訪問資源,或是重定向到某個資源時進行攔截方式配置的 它也是默認值
            2.FORWARD 它描述的是請求轉發的攔截方式配置
            3.ERROR 如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。
             4.INCLUDE 如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用
二、MD5加密
     在mysql中可以對數據進行md5加密
       Md5(字段)
         UPDATE USER SET PASSWORD=MD5(PASSWORD);
       在java中也提供了md5加密
         /**
         * 使用md5的算法進行加密
         */
        public static String md5(String plainText) {
           byte[] secretBytes = null;
           try {
             secretBytes = MessageDigest.getInstance("md5").digest(
             plainText.getBytes());
           } catch (NoSuchAlgorithmException e) {
             throw new RuntimeException("沒有md5這個算法!");
           }
           String md5code = new BigInteger(1, secretBytes).toString(16);
           for (int i = 0; i < 32 - md5code.length(); i++) {
             md5code = "0" + md5code;
           }
           return md5code;
三、全局的編碼過濾器
  在java中怎樣可以對一個方法進行功能增強?
    1. 繼承
    2. 裝飾設計模式 
      1. 創建一個類讓它與被裝飾類實現同一個接口或繼承同一個父類
      2. 在裝飾類中持有一個被裝飾類的引用
      3. 重寫要增強的方法
  我們獲取請求參數有以下方法
    1. getParameter
    2. getPrameterValues
    3. getParameterMap
    這三個方法都可以獲取請求參數。
分析后,我們知道getParameter與getParameterValue方法可以依賴于getParamterMap方法來實現。
      // 這個就是我們對request進行裝飾的類
        class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;// 是用于接收外部傳遞的原始的request
          public MyRequest(HttpServletRequest request) {
             super(request); // 是因為父類沒有無參數構造
             this.request = request;
          }
          // @Override
            // public String getParameter(String name) {
              // // 1.得到原來的getParameter方法的值
              // String value = request.getParameter(name); // 亂碼
              //
              // try {
                // return new String(value.getBytes("iso8859-1"), "utf-8");
              // } catch (UnsupportedEncodingException e) {
                // e.printStackTrace();
              // }
              // return null;
          // }
          @Override
          public String getParameter(String name) {
             if (name != null) {
               String[] st = (String[]) getParameterMap().get(name);
               if (st != null && st.length > 0) {
                 return st[0];
               }
             }
             return null;
          }
          @Override
          public String[] getParameterValues(String name) {
             if (name != null) {
               return (String[]) getParameterMap().get(name);
             }
             return null;
          }
private boolean flag = true;
          @Override
          public Map getParameterMap() {
             // 1.得到原始的map集合
             Map<String, String[]> map = request.getParameterMap();// 亂碼
             if (flag) {
               // 2.將map集合中的String[]得到,解決每一個元素的亂碼問題.
               for (String key : map.keySet()) {
String[] st = map.get(key); // 得到每一個數組
for (int i = 0; i < st.length; i++) {
                   try {
                     st[i] = new String(st[i].getBytes("iso8859-1"), "utf-8");
                   } catch (UnsupportedEncodingException e) {
                     e.printStackTrace();
                   }
                 }
               }
               flag = false;
             }
             return map;
}
}
轉載于:https://www.cnblogs.com/soficircle/p/6935078.html
總結
以上是生活随笔為你收集整理的Filter(过滤器)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 第二阶段第三次站立会议
- 下一篇: “萦回上不得”下一句是什么
