Filter trong Servlet



Servlet Filter là các lớp trong Java có thể được sử dụng trong lập trình Servlet cho các mục đích sau:

  • Để chặn các yêu cầu từ một Client trước khi chúng truy cập một nguồn tại backend.

  • Để thao tác các phản hồi từ Server trước khi chúng được gửi trở lại tới Client.

Sau đây chúng tôi đề nghị một số loại Filter sau:

  • Authentication Filters − Các Filter xác nhận

  • Data compression Filters − Các Filter nén dữ liệu

  • Encryption Filters − Các Filter mật mã hóa

  • Các Filter mà kích hoạt các sự kiện truy cập nguồn

  • Image Conversion Filters − Các Filter biến đổi hình ảnh

  • Logging and Auditing Filters − Các Filter kiểm tra log và thống kê

  • MIME-TYPE Chain Filters.

  • Tokenizing Filters .

  • XSL/T Filter − Các Filter biến đổi nội dung XML

Các Filter được triển khai trong web.xml file và sau đó map tới hoặc các tên Servlet hoặc các URL pattern.

Quảng cáo

Các phương thức Servlet Filter

Về cơ bản, một Filter là một lớp Java mà triển khai javax.servlet.Filter Interface. Interface này định nghĩa 3 phương thức:

STTPhương thức và Miêu tả
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Phương thức này được gọi bởi container mỗi khi một cặp request/response được truyền thông qua chain.

2

public void init(FilterConfig filterConfig)

Phương thức này được triệu hồi bởi Web container để chỉ một Filter mà đang được đặt bên trong service

3

public void destroy()

Phương thức được gọi bởi Web container để chỉ một Filter bị hủy khỏi service

Ví dụ về Servlet Filter

Ví dụ sau về Servlet Filter sẽ in địa chỉ IP và thời gian hiện tại của Client. Ví dụ này sẽ giúp bạn hiểu cơ bản về Servlet Filter, nhưng bạn cũng có thể viết các ứng dụng Filter phức tạp hơn bởi sử dụng cùng khái niệm này.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) 
                         throws ServletException{
      // Get init parameter 
      String testParam = config.getInitParameter("test-param"); 

      //Print the init parameter 
      System.out.println("Test Param: " + testParam); 
   }
   public void  doFilter(ServletRequest request, 
                 ServletResponse response,
                 FilterChain chain) 
                 throws java.io.IOException, ServletException {

      // Get the IP address of client machine.   
      String ipAddress = request.getRemoteAddr();

      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time "
                                       + new Date().toString());

      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }
   public void destroy( ){
      /* Called before the Filter instance is removed 
      from service by the web container*/
   }
}

Biên dịch LogFilter.java theo cách thông thường và đặt class file trong <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Ánh xạ Servlet Filter trong Web.xml

Các Filter được định nghĩa và sau đó được ánh xạ tới URL hoặc Servlet, theo cách giống như khi Servlet được định nghĩa và sau đó được ánh xạ tới một URL pattern. Tạo entry sau cho Filter trong web.xml file.

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Filter trên sẽ áp dụng cho tất cả Servlet bởi vì chúng ta xác định /* trong cấu hình. Bạn có thể xác định một Servlet path cụ thể nếu bạn chỉ muốn áp dụng Filter trên một số Servlet nào đó.

Quảng cáo

Sử dụng nhiều Filter trong Servlet

Ứng dụng web của bạn có thể định nghĩa một vài Filter cho một mục đích nào đó. Giả sử bạn định nghĩa hai Filter là AuthenFilterLogFilter. Phần còn lại của tiến trình sẽ giống như ví dụ trên, ngoại trừ việc bạn cần tạo một ánh xạ khác như dưới đây:

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Thứ bậc của các Filter

Bậc của Filter trong web.xml quyết định thứ tự mà Web container áp dụng Filter tới các Servlet. Để đảo ngược thứ tự của Filter, bạn chỉ cần đảo ngược các phần tử ánh xạ Filter trong web.xml.

Trong ví dụ trên, LogFilter sẽ được áp dụng đầu tiên và sau đó áp dụng AuthenFilter tới bất kỳ Servlet nào. Nhưng trong ví dụ sau, thứ tự này sẽ bị đảo ngược.

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Các bạn ở Hà Nội có thể tham gia khóa học thứ 9 của vietjackteam (đang tuyển sinh) vào cuối tháng 10/2018 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : Khóa học Java.Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Số lượng các công việc Java hoặc .NET luôn gấp ít nhất 3 lần Android hoặc iOS trên thị trường tuyển dụng. Khóa online= Đi phỏng vấn, Khóa offline= Đi phỏng vấn+ 1.5 tháng thực tập ngoài doanh nghiệp. .

Mọi người có thể xem demo nội dung khóa học tại địa chỉ Video demo khóa học Offline

Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Từ tháng 4/2018, VietJack khuyến mại giá SỐC chỉ còn 250k cho khóa học, các bạn có thể trả lại tiền nếu không hài lòng về chất lượng trong 1 tháng, liên hệ facebook admin fb.com/tuyen.vietjack để thanh toán chuyển khoản hoặc thẻ điện thoại, khóa học bằng Tiếng Việt với gần 100 video, các bạn có thể chủ động bất cứ lúc nào, và xem mãi mãi. Thông tin khóa học tại Khóa học Java Online trên Udemy

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.

Các bài học SEO phổ biến khác tại VietJack: