Filter接口作用及實例

一、Filter

該接口在HTTP服務器調用資源文件之前,對HTTP服務器進行攔截。

二、作用

  1. 攔截HTTP服務器,幫助HTTP服務器檢測當前請求合法性。
  2. 攔截HTTP服務器,對當前請求進行增強操作。

三、Filter接口實現類開發步驟

  1. 創建一個java類實現Filter接口
  2. 重寫Filter接口中的doFilter方法
  3. 在web.xml文件中將過濾器接口註冊到HTTP服務器

首先是過濾器第一個作用實例,幫助http服務器檢測請求合法性。舉個例子,用戶攜帶參數訪問http服務器上的某個資源文件,對當前參數進行判斷,只有當用戶參數合法時才允許其訪問該文件。直白點說,某個網站資源只有當用戶年齡大於18時才允許訪問,否則將不允許訪問。Filter接口就可以實現這個。
來看下代碼,首先我在web包下放了一張x.png的圖片。
在這裏插入圖片描述
接下來將通過get方式對這張圖片進行訪問,在瀏覽器地址欄輸入localhost:8080/myweb/x.png?age=20(參數直接打在url後面了,當然也可以通過表單等方式獲取用戶參數)。
過濾器接口通過請求對象拿到用戶給的參數值,判斷參數的合法性。如果合法,將把攔截的請求對象和響應對象還給http服務器。如果不合法,拒絕本次請求並在瀏覽器上展示給用戶。

public class OneFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //1、通過攔截請求對象得到請求包參數信息,從而得到來訪用戶的真實年齡
        String age=servletRequest.getParameter("age");
        //2、根據年齡,幫助HTTP服務器判斷本次請求合法性
        if(Integer.valueOf(age)<18){//合法請求
            //將攔截請求對象和響應對象交還給tomcat,由tomcat繼續調用資源文件
            filterChain.doFilter(servletRequest,servletResponse);//放行
        }else{
            //過濾器代替HTTP服務器拒絕本次請求
            servletResponse.setContentType("text/html;charset=UTF-8");
            PrintWriter out=servletResponse.getWriter();
            out.print("<center><font style='color:red;font-size:40px'>不合法的請求</font></center>");
        }

    }
}

別忘了web.xml中註冊filter

    <!-- 將過濾器類文件路徑交給tomcat  -->
    <filter>
        <filter-name>OneFilter</filter-name>
        <filter-class>com.luna.filter.OneFilter</filter-class>
    </filter>
    <!-- 通知tomcat在調用何種資源文件時使用過濾器 -->
    <filter-mapping>
        <filter-name>OneFilter</filter-name>
        <url-pattern>/x.png</url-pattern>
    </filter-mapping>

接下來是過濾器第二個作用實例,對當前請求進行增強操作。我們都知道,當瀏覽器以post方式發送請求給http服務器,那麼http服務器收到請求協議包時會由當前請求對象request負責解碼,而request默認使用ISO-8859-1字符集(一個東歐語系字符集)。如果拿到的參數是中文,控制檯只能是亂碼。這時我們的解決辦法是:在讀取請求體內容之前,應該通知請求對象使用utf-8解析。即讀取參數之前應該有這樣一行代碼:request.setCharacterEncoding(“UTF-8”);
那麼問題來了,如果你有100個servelt都需要接收瀏覽器以post方式發送的請求,那麼這行代碼要寫100遍嗎??
當然不用,Filter就是來解決這個問題的。
首先給一個html,裏面有兩個表單都是以post方式提交…

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
        <form action="/myweb/one" method="post">
            參數:<input type="text" name="para"><br>
            <input type="submit" value="以post方式獲得OneServlet的參數">
        </form>
        <form action="/myweb/two" method="post">
            參數:<input type="text" name="para"><br>
            <input type="submit" value="以post方式獲得TwoServlet的參數">
        </form>
    </center>
</body>
</html>

兩個servlet,獲取用戶提交的參數

public class OneServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String para=request.getParameter("para");
        System.out.println("OneServlet:"+para);
    }
}
public class TwoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String para=request.getParameter("para");
        System.out.println("TwoServlet:"+para);
    }

}

然後就是Filter。只要在過濾器裏將你想要過濾的操作寫入,再將請求對象和響應對象還給http服務器。

public class OneFileter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");//設置過濾內容
        filterChain.doFilter(servletRequest,servletResponse);//放行
    }
}

web.xml註冊不能忘,不然就沒效果了。這個 標籤中的/*表示過濾所有的資源文件。

    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.luna.controller.OneServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.luna.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>OneFilter</filter-name>
        <filter-class>com.luna.filter.OneFileter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OneFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

這樣我們就會發現,兩個servlet通過post提交的數據在控制檯上都能夠正常顯示了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章