[Servlet/JSP] Lập trình Servlet Filter P3: Mô hình làm việc của Filter, Tham sô khởi tạo Servlet Filter

Đăng bởi: Admin | Lượt xem: 4721 | Chuyên mục: Servlet/JSP

Trong bài trước ta đã biết cách chạy và cài đặt môi trường cho Project Servlet Filter. Dựa vào những gì đã thực hiện ở bài trên ta tiếp tục làm tiếp ví dụ để hiểu mô hình làm việc của Filter và các tham số khởi tạo Servlet Filter.


Để thực hiện được ví dụ này, chúng ta cần đọc lại bài viết trươc để nắm kiến thức cơ bản về Servlet trong chuỗi bài học lập trình Servlet cơ bản tại đây.

Xem bài viết trước về Servlet Filter tại đây.

6- Ví dụ Servlet-Filter đầu tiên

Servlet Filter là một class thi hành interface javax.servlet.Filter. Class LogFilter dưới đây ghi lại thời gian và đường dẫn của yêu cầu gửi tới WebApp.

LogFilter.java

package org.o7planning.tutorial.servletfilter;
 
import java.io.IOException;
import java.util.Date;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
public class LogFilter implements Filter {
 
    public LogFilter() {
    }
 
    @Override
    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("LogFilter init!");
    }
 
    @Override
    public void destroy() {
        System.out.println("LogFilter destroy!");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
 
        HttpServletRequest req = (HttpServletRequest) request;
 
        String servletPath = req.getServletPath();
 
        System.out.println("#INFO " + new Date() + " - ServletPath :" + servletPath //
                + ", URL =" + req.getRequestURL());
 
        // Cho phép request được đi tiếp. (Vượt qua Filter này).
        chain.doFilter(request, response);
    }
 
}

Bạn cần đăng ký các đường dẫn phải đi qua bộ lọc ( Filter) này trong web.xml:

Thêm vào đoạn cấu hình trong web.xml:

<!--
 Khai báo một filter có tên logFilter
-->
<filter>
  <filter-name>logFilter</filter-name>
  <filter-class>org.o7planning.tutorial.servletfilter.LogFilter</filter-class>
</filter>
 
<!--
 Khai báo các đường dẫn (của trang) sẽ chịu tác dụng của logFilter
 /* có nghĩa là mọi đường dẫn.
-->
<filter-mapping>
  <filter-name>logFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
 
<display-name>ServletFilterTutorial</display-name>
 
<filter>
 <filter-name>logFilter</filter-name>
 <filter-class>org.o7planning.tutorial.servletfilter.LogFilter</filter-class>
</filter>
 
<filter-mapping>
 <filter-name>logFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

 <welcome-file-list>
 <welcome-file>index.html</welcome-file>
 <welcome-file>index.htm</welcome-file>
 <welcome-file>index.jsp</welcome-file>
 <welcome-file>default.html</welcome-file>
 <welcome-file>default.htm</welcome-file>
 <welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

Chạy lại ứng dụng của bạn:

Bạn có thể chạy các đường dẫn sau trên trình duyệt, ở đây có cả những đường dẫn tới các nguồn không hề tồn tại trên WebApp của bạn, tuy nhiên nó vẫn chịu tác dụng của LogFilter.

Các thông tin Log được ghi ra trên màn hình Console:

Đoạn code sau cho phép request vượt qua bộ lọc ( Filter) để tiếp tục tiến tới đích (trang mong muốn).

// Cho phép request đi tiếp lên phía trước.
// Nó có thể tới một Filter tiếp theo hoặc tới mục tiêu. 
chain.doFilter(request, response);

7- Mô hình làm việc của Filter

Khi người dùng gửi một yêu cầu, mục tiêu (target) có thể là một nguồn dữ liệu (resource) hoặc một servlet. Request cần phải đi qua các Filter và cuối cùng là mục tiêu. Các filter và mục tiêu được xích lại (chained) với nhau giống hình minh họa dưới đây:

Sử dụng chain.doFilter(request,response) để di chuyển request tới mắt xích tiếp theo. Nếu trong filter chain.doFilter(request, response) không được gọi, yêu cầu của người dùng sẽ không đến được mục tiêu, nó bị dừng lại tại filter đó.

8- Tham số Khởi tạo cho Servlet-Filter

Cũng giống với Servlet, bạn có thể khởi tạo các tham số cho Filter. Ví dụ dưới đây một Filter làm nhiệm  vụ ghi ra log vào một file, bạn có thể cấu hình trong web.xml tên file để ghi.

Log2Filter.java

package org.o7planning.tutorial.servletfilter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
public class Log2Filter implements Filter {
 
    private String logFile;
 
    public Log2Filter() {
    }
 
    @Override
    public void init(FilterConfig fConfig) throws ServletException {
        this.logFile = fConfig.getInitParameter("logFile");
 
        System.out.println("Log File " + logFile);
    }
 
    @Override
    public void destroy() {
        System.out.println("Log2Filter destroy!");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
 
        if (this.logFile != null) {
            // Ghi thông tin Log vào File.
            this.logToFile(this.logFile);
        }
 
        // Cho phép request được đi tiếp. (Vượt qua Filter này).
        chain.doFilter(request, response);
    }
 
    private void logToFile(String fileName) {
        // Ghi log vào file..
        System.out.println("Write log to file " + fileName);
    }
 
}

Thêm đoạn cấu hình vào web.xml:

<filter>
   <filter-name>log2Filter</filter-name>
   <filter-class>org.o7planning.tutorial.servletfilter.Log2Filter</filter-class>
   <init-param>
       <param-name>logFile</param-name>
       <param-value>AppLog.log</param-value>
   </init-param>
</filter>
 
<filter-mapping>
   <filter-name>log2Filter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletFilterTutorial</display-name>
 
<filter>
  <filter-name>logFilter</filter-name>
  <filter-class>org.o7planning.tutorial.servletfilter.LogFilter</filter-class>
</filter>
 
<filter-mapping>
  <filter-name>logFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
 
 
<filter>
  <filter-name>log2Filter</filter-name>
  <filter-class>org.o7planning.tutorial.servletfilter.Log2Filter</filter-class>
  <init-param>
      <param-name>logFile</param-name>
      <param-value>AppLog.log</param-value>
  </init-param>
</filter>
 
<filter-mapping>
  <filter-name>log2Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
  
 
 
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

Xem bài viết tiếp theo tại đây.

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Servlet/JSP