Filter trong JSP
Servlet và JSP Filter là các lớp Java, có thể được sử dụng trong lập trình Servlet và JSP với các mục đích sau: Sau đây chúng tôi đề nghị một số loại Filter sau: Các Filter được triển khai trong web.xml file và sau đó ánh xạ tới hoặc các tên Servlet hoặc các tên JSP hoặc các URL patter ...
Servlet và JSP Filter là các lớp Java, có thể được sử dụng trong lập trình Servlet và JSP với các mục đích sau:
Sau đây chúng tôi đề nghị một số loại Filter sau:
Các Filter được triển khai trong web.xml file và sau đó ánh xạ tới hoặc các tên Servlet hoặc các tên JSP hoặc các URL patter trong ứng dụng của bạn. Deployment Descriptor web.xml file có thể được tìm thấy trong thư mục <Tomcat-installation-directory>conf.
Khi JSP container bắt đầu trình duyệt web của bạn, nó tạo một minh họa của mỗi Filter mà bạn đã khai báo trong Deployment Descriptor. Các Filter này thực thi theo thứ tự mà chúng đã được khai báo trong Deployment Descriptor đó.
Các phương thức JSP 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:
STT | Phươ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ụ JSP Filter
Sau đây là ví dụ về JSP Filter sẽ in địa chỉ IP và thời gian hiện tại của Client mỗi khi nó truy cập bất kỳ JSP file nào. Ví dụ này sẽ giúp bạn hiểu cơ bản về JSP 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 với tên là LogFilter.clall trong <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.
Ánh xạ JSP Filter trong web.xml
Các Filter được định nghĩa và sau đó được ánh xạ tới một tên URL hoặc JSP file, theo cách giống như khi Servlet được định nghĩa và sau đó được ánh xạ tới một URL pattern trong web.xml file. Tạo entry sau cho thẻ 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 và JSP 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 hoặc JSP path cụ thể nếu bạn chỉ muốn áp dụng Filter trên một số Servlet nào đó.
Bây giờ thử gọi bất kỳ Servlet hoặc JSP theo cách thông thường và bạn sẽ thấy log được tạo trong Web server log của bạn. Bạn có thể sử dụng Log4j để log tất log trên trong một file riêng biệt.
Sử dụng nhiều Filter trong JSP
Ứ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à AuthenFilter và LogFilter. 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 trong JSP
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 hoặc JSP. Để đả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 hoặc JSP 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>