Servlet Filter


ก่อนที่ Request จาก Client จะถึง Servlet พวก request เหล่านั้นต้องผ่าน Filter ก่อนโดยเจ้า Filter นี่ก็เป็นตัวที่ทำหน้าที่ “กั้น” Client Request และ Server Response เมื่อ Client Request เข้ามาก่อนจะถึง Resource ของ Servlet,JSP หรือ HTML ก็ต้องผ่าน Filter ก่อน ดังนั้นก่อนที่จะถึง Resource Filter ก็จะสามารถจัดการอะไรบางอย่างกับ Request ได้และเมื่อได้ Resource แล้ว Filter ก็จะสามารถจัดการก่อนที่จะส่ง Response กลับไปหา Client ได้เช่นกัน

เพื่อให้เห็นการทำงานของ Filter ผมจะสร้างโปรเจคตัวอย่างโดยใช้ Netbean และ Tomcat โดยเริ่มจากสร้างโปรเจคที่เป็น Web Application

โดยผมจะตั้งชื่อโปรเจคว่า ServletFilter โดยใช้ค่าอื่นๆเป็น Default ทั้งหมด จากนั้นเราจะทำการสร้าง Pagekage และ Servlet Filter Class กันครับ

ผมได้ทำการสร้าง Class ชื่อ FirstFilter ใน Package cc.co.greannetwork.servletfilter.servlet.filter ซึ่งจะทำการเพิ่มโค๊ดดังนี้ครับ

package cc.co.greannetwork.servletfilter.servlet.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 *
 * @author Grean
 */
public class FirstFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("First Filter is doFilter request");
        chain.doFilter(request, response);
        System.out.println("First Filter is doFilter response");
    }

    @Override
    public void destroy() {
    }

}

ทำการสร้าง Filter อีกตัวหนึ่งชื่อ SecondFilter ซึ่งมีรายละเอียดคล้ายกับตัวแรก

package cc.co.greannetwork.servletfilter.servlet.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 *
 * @author Grean
 */
public class SecondFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Second Filter is doFilter request");
        chain.doFilter(request, response);
        System.out.println("Second Filter is doFilter response");
    }

    @Override
    public void destroy() {
    }

}

เมื่อเราได้ทำการสร้าง Filter แล้วต่อไปก็คือการเรียกใช้โดยเราจะเรียกใช้ผ่าน web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	 version="3.0">
    
    <!-- Define Filter -->
        <filter>
        <filter-name>SecondFilter</filter-name>
        <filter-class>cc.co.greannetwork.servletfilter.servlet.filter.SecondFilter</filter-class>
    </filter>
    <filter>
        <filter-name>FirstFilter</filter-name>
        <filter-class>cc.co.greannetwork.servletfilter.servlet.filter.FirstFilter</filter-class>
    </filter>

    
    <!-- map Filter -->
    <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>SecondFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

ลำดับการเรียกใช้งาน Filter จะเรียงตาม filter-mapping ถ้าเราประกาศตัวไหนก่อนตัวนั้นก็จะถูกเรียกใช้ก่อน ซึ่งเมื่อเราทำการ Run Project จะมีข้อความออกที่ Log

First Filter is doFilter request
Second Filter is doFilter request
Second Filter is doFilter response
First Filter is doFilter response

จะเห็นได้ว่าเมื่อ Client Request จะถูก Filter จากตัวแรกไปตัวสุดท้ายตามลำดับใน Filter-mapping แต่เมื่อ Server Response กลับจะเรียงจากตัวสุดท้ายไปหาตัวแรก

จากตัวอย่างตรงนี้เป็นการเขียน Filter แบบคร่าวๆ ซึ่งการนำไปใช้งานมีหลากหลายแล้วแต่จะประยุกต์ใช้งานครับ

Advertisements

One thought on “Servlet Filter

  1. Pingback: Servlet Filter | Genistree Blogs

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s