Filter คือ Java class ที่ implement interface javax.servlet.Filter ใช้ intercept request/response ก่อนถึง resource หรือก่อนส่งกลับ client
ตัวอย่าง LogFilter - บันทึก IP และเวลา
package com.example;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
String testParam = config.getInitParameter("test-param");
System.out.println("Test Param: " + testParam);
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 1. Pre-processing: ก่อนไปถึง JSP/Servlet
String ipAddress = request.getRemoteAddr();
System.out.println("IP: " + ipAddress + ", Time: " + new Date());
// 2. ส่งต่อไปยัง filter ถัดไป หรือ target resource
chain.doFilter(request, response);
// 3. Post-processing: หลังจาก JSP/Servlet ทำงานเสร็จ (optional)
// System.out.println("Response sent");
}
public void destroy() {
// cleanup resources
}
}
2. คอมไพล์และวางไฟล์ class
วาง LogFilter.class ใน <Tomcat>/webapps/ROOT/WEB-INF/classes/com/example/
3. กำหนดใน web.xml
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.example.LogFilter</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>Initialization Parameter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- ทุก request -->
</filter-mapping>
4. ทดสอบ
เรียก JSP หรือ Servlet ใดๆ ดู log ใน console เซิร์ฟเวอร์ จะเห็น IP และ timestamp
แนวทางปฏิบัติที่ดี
- ใช้ logging framework (Log4j, SLF4J) แทน System.out.println
- จัดการ exception ให้เหมาะสม
- ไม่ทำ blocking operations ใน doFilter
- จำไว้ว่า
chain.doFilter()ต้องถูกเรียกเสมอ (เว้นแต่จะ block request)
ประเภท Filters ยอดนิยม
- Authentication / Authorization
- Logging / Auditing
- Encoding / Character set
- Compression (GZIP)
- CORS headers