ตัวกรองใน Servlets และ JSP เป็นคลาส Java และวัตถุประสงค์ของการมีอยู่มีดังนี้:
สกัดกั้นเมื่อขอการเข้าถึงทรัพยากรแบ็กเอนด์
จัดการการตอบกลับที่ส่งคืนจากเซิร์ฟเวอร์ไปยังไคลเอนต์
ตัวกรองทั่วไปหลายประเภทมีดังต่อไปนี้:
ตัวกรองการรับรองความถูกต้อง
ตัวกรองการบีบอัดข้อมูล
ตัวกรองการเข้ารหัส
ตัวกรองที่ทำให้เกิดเหตุการณ์การเข้าถึงทรัพยากร
ตัวกรองการแปลงรูปภาพ
ตัวกรองการเข้าสู่ระบบและการรับรองความถูกต้อง
ตัวกรองโซ่ชนิด MIME
ตัวกรองโทเค็น
ตัวกรอง XSL/T สำหรับการแปลงเนื้อหา XML
ตัวกรองจะถูกแทรกลงในไฟล์ web.xml และแม็พกับชื่อของเซิร์ฟเล็ต ไฟล์ JSP หรือรูปแบบ URL ไฟล์คำอธิบายการปรับใช้ web.xml สามารถพบได้ในไดเร็กทอรี <Tomcat-installation-directory>conf
เมื่อคอนเทนเนอร์ JSP เริ่มต้นเว็บแอปพลิเคชัน จะสร้างอินสแตนซ์ของแต่ละตัวกรอง ตัวกรองเหล่านี้จะต้องได้รับการประกาศในไฟล์ตัวอธิบายการปรับใช้ web.xml และดำเนินการตามลำดับที่มีการประกาศ
ตัวกรองคือคลาส Java ที่ใช้อินเทอร์เฟซ javax.servlet.Filter อินเทอร์เฟซ javax.servlet.Filter กำหนดสามวิธี:
หมายเลขซีเรียล | วิธีการ และ คำอธิบาย |
---|---|
1 | โมฆะสาธารณะ doFilter (ServletRequest, ServletResponse, FilterChain) คอนเทนเนอร์จะเรียกใช้เมธอดนี้เมื่อใดก็ตามที่คำขอ/การตอบสนองผ่านห่วงโซ่ตัวกรอง เนื่องจากไคลเอ็นต์ร้องขอทรัพยากรที่ส่วนท้ายของห่วงโซ่ |
2 | โมฆะสาธารณะ init (FilterConfig filterConfig) คอนเทนเนอร์เรียกเมธอดนี้เพื่อระบุว่ามีการวางตัวกรองไว้ในบริการ |
3 | โมฆะสาธารณะ destroy() เมธอดนี้ถูกเรียกโดยคอนเทนเนอร์เพื่อระบุว่าตัวกรองกำลังถูกลบออกจากบริการ |
ตัวอย่างนี้จะพิมพ์ที่อยู่ IP และวันที่และเวลาของการเข้าถึงไฟล์ JSP แต่ละครั้ง แน่นอนว่านี่เป็นเพียงตัวอย่างง่ายๆ เพื่อให้คุณทราบถึงการใช้ตัวกรองแบบง่ายๆ แต่คุณสามารถใช้แนวคิดเหล่านี้เพื่อสร้างโปรแกรมที่ซับซ้อนมากขึ้นได้ด้วยตัวเอง
//แนะนำแพ็คเกจ Java import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*; // Implement the Filter class public class LogFilter ดำเนิน Filter { public void init( FilterConfig config) ส่ง ServletException{ // รับพารามิเตอร์การเริ่มต้น String testParam = config.getInitParameter("test-param"); // พิมพ์พารามิเตอร์การเริ่มต้น System.out.println ("Test Param: " + testParam); } โมฆะสาธารณะ doFilter (คำขอ ServletRequest, การตอบสนอง ServletResponse, ลูกโซ่ FilterChain) พ่น java.io.IOException, ServletException { // รับที่อยู่ IP ของไคลเอ็นต์ String ipAddress = request.getRemoteAddr(); // ที่อยู่ IP เอาท์พุตและเวลาปัจจุบัน System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // ส่งผ่านตัวกรองคำขอ chain.doFilter(request,response); } public void destroy( ){ /* หลังจากอินสแตนซ์ตัวกรองถูกทำลายใน เซิร์ฟเวอร์ถูกเรียกก่อนที่จะลบ -
คอมไพล์ไฟล์ LogFilter.java จากนั้นวางไฟล์คลาสที่คอมไพล์แล้วในไดเร็กทอรี <Tomcat Installation Director>/webapps/ROOT/WEB-INF/classes
ตัวกรองถูกกำหนดแล้วแม็พกับชื่อไฟล์ URL หรือ JSP เช่นเดียวกับวิธีการกำหนดและแม็พเซิร์ฟเล็ต ในไฟล์คำอธิบายการปรับใช้ web.xml ให้ใช้แท็ก <filter> สำหรับการแมปตัวกรอง:
<ตัวกรอง> <ตัวกรองชื่อ>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >พารามิเตอร์การเริ่มต้น</param-value> </init-param></filter><filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
ตัวกรองด้านบนจะถูกนำไปใช้กับเซิร์ฟเล็ตและโปรแกรม JSP ทั้งหมดเนื่องจากเราระบุ "/*" ในการกำหนดค่า คุณยังสามารถระบุเซิร์ฟเล็ตหรือพาธ JSP ได้ หากคุณต้องการใช้ตัวกรองกับเซิร์ฟเล็ตหรือโปรแกรม JSP เพียงไม่กี่โปรแกรมเท่านั้น
ตอนนี้ ให้เข้าถึงเซิร์ฟเล็ตหรือเพจ JSP ตามปกติ แล้วคุณจะพบบันทึกของการเข้าถึงนี้ในบันทึกของเซิร์ฟเวอร์ คุณยังสามารถใช้ตัวบันทึก Log4J เพื่อเข้าสู่ไฟล์อื่นได้
เว็บแอปพลิเคชันของคุณสามารถกำหนดตัวกรองต่างๆ ได้มากมาย เมื่อคุณกำหนดตัวกรองไว้สองตัวแล้ว ได้แก่ AuthenFilter และ LogFilter ขั้นตอนอื่นๆ จะเหมือนเดิม ยกเว้นว่าคุณสร้างการแมปที่แตกต่างกัน เช่นนี้
<ตัวกรอง> <ตัวกรองชื่อ>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >พารามิเตอร์การเริ่มต้น</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>พารามิเตอร์การเริ่มต้น</param-value> </init-param> </ตัวกรอง> <การแมปตัวกรอง> <ชื่อตัวกรอง>LogFilter</filter-name> <url-รูปแบบ>/*</url-รูปแบบ></กรอง-การแมป> <การแมปตัวกรอง> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
ลำดับการแมปขององค์ประกอบ <filter> ใน web.xml จะกำหนดลำดับที่คอนเทนเนอร์ใช้ตัวกรองเหล่านี้ หากต้องการกลับลำดับของแอปพลิเคชัน คุณเพียงกลับลำดับที่กำหนดองค์ประกอบ <filter> ใน web.xml
ตัวอย่างเช่น ตัวอย่างข้างต้นจะใช้ LogFilter ก่อน จากนั้นจึงใช้ AuthenFilter แต่ตัวอย่างต่อไปนี้จะกลับลำดับของแอปพลิเคชัน:
<การแมปตัวกรอง> <ชื่อตัวกรอง>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>LogFilter</filter -name> <url-pattern>/*</url-pattern></filter-mapping>