1. 程式人生 > 實用技巧 >Javaweb學習之過濾器(Filter)的使用

Javaweb學習之過濾器(Filter)的使用

概念

過濾器就是對web資源進行攔截,進行一些處理後再交給下一個過濾器或servlet,甚至直接交給客戶端或伺服器;可以攔截request進行處理的,也可以對返回的response進行攔截後處理。並且一個請求或一個響應都可以經過多層過濾器,如下圖所示:

用途

  • 自動登入

  • 設定統一的編碼格式,避免亂碼

  • 訪問許可權的控制

  • 進行敏感字元過濾(如經常遇到的不文明發言被過濾或者以“*”的形式顯示出來)

    ......

示例

這裡以一個servlet和一個filter作為示例。

servlet作為請求,向瀏覽器寫入一串中文字元,發生亂碼是意料之中的事情:

package
servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class show extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException { /* resp.setContentType("text/html;charset=utf-8"); resp.setCharacterEncoding("UTF-8");*/ resp.getWriter().write("好久不見,你還好嗎?"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

servlet的註冊:

<servlet>
    <servlet-name>show</servlet-name>
    <servlet-class>servlet.show</servlet-class>
</servlet><servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/show</url-pattern>
</servlet-mapping>

這裡設定兩個路徑是為了方便測試過濾器是否起作用。下面的過濾器註冊的路徑是/servlet/*,意味著/servlet路徑下面的頁面才能實現過濾器。

當然,上述的servlet可以使用程式碼中被註釋掉的部分進行編碼的設定,防止亂碼的發生。但此種方法需要無意義地重複,不推薦使用。而過濾器就可以完成這項工作。

使用步驟

  • 新建一個類,實現Filter介面

  • 重寫三個方法

  • 在web.xml中註冊(或使用註解)

需要重寫的三個方法的作用:

void init(FilterConfig var1) throws ServletException; //過濾器初始化,在伺服器啟動時就自動執行了。

void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; //過濾器的主體部分,過濾的程式碼在這裡編寫。

void destroy(); //過濾器的銷燬,在伺服器關閉時實現。

package filter;
import javax.servlet.*;
import java.io.IOException;
public class Encode implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter 初始化");
    }
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
​
        System.out.println("過濾器執行前");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("過濾器執行後");
    }
    public void destroy() {
        System.out.println("Filter 已被銷燬");
    }
}

最後是註冊,完成後即可使用:

<filter>
    <filter-name>Encode</filter-name>
    <filter-class>filter.Encode</filter-class>
</filter>
<filter-mapping>
    <filter-name>Encode</filter-name>
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>