Làm việc với Filter
Filter là đối tượng nằm giữa request của Client và Web Container. Filter có nhiều công dụng như: đọc request của client, chuyển đổi request thành dạng dữ liệu khác trước khi chuyển xuống Web container, chuyển đổi response thành dữ liệu khác trước khi truyền về client, gửi thông báo error về cho client, tạo ra response của chính filter gửi về client…. Chính những công dụng này làm cho filter trở thành 1 công cụ rất mạnh cho người viết Web. Tuy nhiên người lập trình cần phải cẩn thận khi dùng filter vì làm việc với filter cần phải có kiến thức về HTTP protocol hơn làm việc với Servlet.
I. Filter là gì
Về cơ bản filter là đối tượng cho phép can thiệp vào dữ liệu từ request và response trước khi dữ liệu này đến điểm cuối là Web Container hay browser như hình sau:
II. Vòng đời của một Filter:
Vòng đời của một Filter giống như vòng đời của một Servlet: khởi tạo, thi hành và tiêu hủy. Việc khởi tạo 1 filter chỉ được thực hiện 1 lần khi Web Application lần đầu gọi Filter để sử dụng, phần thi hành của 1 filter được gọi khi có resquest hay response cần dùng filter đó, khi Web Application hoàn toàn không còn dùng filter nữa thì vòng đời của filter sẽ kết thúc
III. Tạo Filter:
Filter bản chất là một Java class kế thừa từ interface javax.servlet.Filter. Interface này bao gồm các phương thức sau:
- void init(FilterConfig config) throws ServletException: Hàm khởi tạo các thông số cho Filter, được thi hành khi khởi tạo Filter
- void destroy(): hàm hủy Filter
- void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException: hàm thực thi, được thi hành khi có resquest hay response dùng filter.
IV. Filter Chains:
Filter chains là đối tượng giúp cho Filter có nhiều công dụng hơn như Servlet. Như đồ hình bên dưới cho thấyFilter có thể làm chức năng như Servlet dù đó không phải là công dụng ban đầu khi Filter được thiết kế ra. Như giới thiệu phía trên, hàm doFilter có 3 tham số, request, response như Servlet, FilterChain là tham số mới hơn so với Servlet, nó công dụng giúp Filter truyền resquest hay response qua nhiều Filter khác nhau
V. Ví dụ Filter:
Trong bài này chúng ta làm ví dụ về Filter đơn giản: Tạo 1 Filter ngăn chặn không cho 1 địa chỉ IP vào trang web của chúng ta
Tạo Filter: Để tạo Filter chúng ta làm theo các bước sau:
- R.C vào project chọn New/ Other, chọn mục Web chọn Filter.
Ở bước thứ 3 chúng ta khai báo Filter name, Apply To nếu chúng ta để /* nghĩa là tất cả các request đều phải qua filter này, chúng ta có thể thay đổi bằng cách nhấn vào nút Edit
Ở bước thứ 4 chúng ta khai báo các biến Init Parameter. Sau khi Finish chúng ta sẽ thấy trong web.xml những dòng khai báo filter:
<filter>
<filter-name>boDuaFilter</filter-name>
<filter-class>Filter.boDuaFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>boDuaFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- Sau đó viết đoạn code sau cho cho filter boDuaFilter:
package Filter;
import java.io.IOException;
import java.util.StringTokenizer;
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.HttpServletResponse;
public class IPFilter implements Filter {
private FilterConfig config;
public final static String IP_RANGE = "127.0";
public IPFilter() {
}
// Hàm khởi tạo cho filter
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
public void doFilter(ServletRequest request,ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Đọc IP của client
String ip = request.getRemoteAddr();
// Chuyển đổi response từ ServletResponse thành HttpServletResponse
HttpServletResponse httpResp = null;
if (response instanceof HttpServletResponse) {
httpResp = (HttpServletResponse) response;
}
//Đọc IP của client thành những phần nhỏ
StringTokenizer toke = new StringTokenizer(ip, ".");
int dots = 0;
String byte1 = "";
String byte2 = "";
String client = "";
while (toke.hasMoreTokens()) {
++dots;
//Thành phần đầu tiên
if (dots == 1) {
byte1 = toke.nextToken();
} else {
//Thành phần thứ 2
byte2 = toke.nextToken();
break;//only interested in first two bytes
}
}
// Ghép 2 thành phần
client = byte1 + "." + byte2;
// So sánh 2 chuỗi nếu trùng thì không cho IP này vào trang web
if (IP_RANGE.equals(client)) {
httpResp.sendError(HttpServletResponse.SC_FORBIDDEN,
"That means goodbye forever! Message from BoDuaGroup");
} else {
//Client có thể vào web
chain.doFilter(request, response);
}
}// doFilter
public void destroy() {
/*called before the Filter instance is removed
from service by the web container*/
}
}
- Khi thi hành chúng ta có kết qua sau:
Tham khảo từ nguồn:
Addison Wesley: Servlets and JavaServer Pages The J2EE Technology Web Tier
O’Reilly: Java Servlet and JSP cook book
No comments:
Post a Comment