Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

วิธีใช้ Filter ใน JSP (ตัวอย่าง LogFilter)

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