Servlets - Bộ lọc viết
Bộ lọc Servlet là các lớp 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áy khách trước khi họ truy cập tài nguyên ở phía sau.
Để thao tác các phản hồi từ máy chủ trước khi chúng được gửi lại cho máy khách.
Có nhiều loại bộ lọc khác nhau được đề xuất bởi các thông số kỹ thuật -
- Bộ lọc xác thực.
- Bộ lọc nén dữ liệu.
- Bộ lọc mã hóa.
- Bộ lọc kích hoạt các sự kiện truy cập tài nguyên.
- Bộ lọc Chuyển đổi Hình ảnh.
- Bộ lọc Ghi nhật ký và Kiểm toán.
- Bộ lọc chuỗi MIME-TYPE.
- Mã hóa bộ lọc.
- Bộ lọc XSL / T chuyển đổi nội dung XML.
Bộ lọc được triển khai trong tệp mô tả triển khai web.xml và sau đó ánh xạ tới tên servlet hoặc các mẫu URL trong bộ mô tả triển khai ứng dụng của bạn.
Khi vùng chứa web khởi động ứng dụng web của bạn, nó sẽ tạo một phiên bản của từng bộ lọc mà bạn đã khai báo trong bộ mô tả triển khai. Các bộ lọc thực thi theo thứ tự mà chúng được khai báo trong bộ mô tả triển khai.
Phương pháp lọc Servlet
Bộ lọc chỉ đơn giản là một lớp Java thực thi giao diện javax.servlet.Filter. Giao diện javax.servlet.Filter xác định ba phương thức:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Phương thức này được vùng chứa gọi mỗi khi một cặp yêu cầu / phản hồi được chuyển qua chuỗi do yêu cầu của khách hàng đối với tài nguyên ở cuối chuỗi. |
2 | public void init(FilterConfig filterConfig) Phương thức này được gọi bởi vùng chứa web để cho biết với bộ lọc rằng nó đang được đưa vào dịch vụ. |
3 | public void destroy() Phương thức này được gọi bởi vùng chứa web để cho biết với bộ lọc rằng nó đang được đưa ra khỏi dịch vụ. |
Bộ lọc Servlet - Ví dụ
Sau đây là Ví dụ về Bộ lọc Servlet sẽ in địa chỉ IP của máy khách và ngày giờ hiện tại. Ví dụ này sẽ cung cấp cho bạn hiểu biết cơ bản về Bộ lọc Servlet, nhưng bạn có thể viết các ứng dụng bộ lọc phức tạp hơn bằng cách sử dụng cùng một khái niệm -
// 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 tệp lớp của bạn vào <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / class
Ánh xạ bộ lọc Servlet trong Web.xml
Các bộ lọc được định nghĩa và sau đó được ánh xạ tới một URL hoặc Servlet, giống như cách Servlet được định nghĩa và sau đó được ánh xạ tới một mẫu URL. Tạo mục nhập sau cho thẻ bộ lọc trong tệp mô tả triển khaiweb.xml
<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>
Bộ lọc trên sẽ áp dụng cho tất cả các servlet vì chúng tôi đã chỉ định /*trong cấu hình của chúng tôi. Bạn có thể chỉ định một đường dẫn servlet cụ thể nếu bạn chỉ muốn áp dụng bộ lọc trên một vài servlet.
Bây giờ hãy thử gọi bất kỳ servlet nào theo cách thông thường và bạn sẽ thấy nhật ký được tạo trong nhật ký máy chủ web của mình. Bạn có thể sử dụng trình ghi Log4J để đăng nhập ở trên đăng nhập vào một tệp riêng biệt.
Sử dụng nhiều bộ lọc
Ứng dụng web của bạn có thể xác định một số bộ lọc khác nhau với một mục đích cụ thể. Hãy xem xét, bạn xác định hai bộ lọc AuthenFilter và LogFilter . Phần còn lại của quá trình sẽ vẫn như được giải thích ở trên ngoại trừ bạn cần tạo một ánh xạ khác như đã đề cập bên dưới -
<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>
Đơn đặt hàng bộ lọc
Thứ tự của các phần tử ánh xạ bộ lọc trong web.xml xác định thứ tự mà vùng chứa web áp dụng bộ lọc cho servlet. Để đảo ngược thứ tự của bộ lọc, bạn chỉ cần đảo ngược các phần tử ánh xạ bộ lọc trong tệp web.xml.
Ví dụ, ví dụ trên sẽ áp dụng LogFilter trước và sau đó nó sẽ áp dụng AuthenFilter cho bất kỳ servlet nào nhưng ví dụ sau sẽ đảo ngược thứ tự:
<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>