1. บทนำสู่ตัวกรอง
ตัวกรองเรียกอีกอย่างว่าตัวกรอง มันเป็นเทคโนโลยีที่น่าตื่นเต้นที่สุดในเทคโนโลยีเซิร์ฟเล็ต ด้วยเทคโนโลยีตัวกรองนักพัฒนาเว็บจะสกัดกั้นทรัพยากรเว็บทั้งหมดที่จัดการโดยเว็บเซิร์ฟเวอร์: เช่น JSP, Servlet, ไฟล์ภาพคงที่หรือไฟล์ HTML แบบคงที่ซึ่งจะได้รับฟังก์ชั่นพิเศษบางอย่าง ตัวอย่างเช่นใช้ฟังก์ชั่นขั้นสูงบางอย่างเช่นการควบคุมการเข้าถึงการอนุญาตระดับ URL, การกรองคำศัพท์ที่ละเอียดอ่อนและข้อมูลการตอบสนองการบีบอัด
Servlet API ให้อินเทอร์เฟซตัวกรอง เมื่อพัฒนาเว็บแอปพลิเคชันหากคลาส Java ที่เป็นลายลักษณ์อักษรใช้อินเทอร์เฟซนี้คลาส Java จะเรียกว่าตัวกรองตัวกรอง ผ่านเทคโนโลยีตัวกรองนักพัฒนาสามารถใช้คำขอเข้าถึงและการตอบกลับของผู้ใช้ก่อนที่จะเข้าถึงทรัพยากรเป้าหมายดังที่แสดงด้านล่าง:
2. ตัวกรองสกัดกั้นอย่างไร?
มีวิธี Dofilter ในอินเทอร์เฟซตัวกรอง เมื่อเราเขียนตัวกรองและกำหนดค่าทรัพยากรเว็บที่จะสกัดกั้นเว็บเซิร์ฟเวอร์จะเรียกใช้วิธี Dofilter ของตัวกรองทุกครั้งก่อนที่จะเรียกใช้วิธีการบริการของทรัพยากรเว็บ ดังนั้นการเขียนโค้ดในวิธีนี้สามารถบรรลุวัตถุประสงค์ต่อไปนี้:
1. ให้โค้ดชิ้นหนึ่งดำเนินการก่อนเรียกทรัพยากรเป้าหมาย
2. ไม่ว่าจะเรียกทรัพยากรเป้าหมายหรือไม่ (นั่นคือไม่ว่าจะอนุญาตให้ผู้ใช้เข้าถึงทรัพยากรเว็บ)
3. หลังจากโทรหาทรัพยากรเป้าหมายให้ชิ้นส่วนของรหัสดำเนินการ
เมื่อเว็บเซิร์ฟเวอร์เรียกวิธี Dofilter มันจะผ่านวัตถุ FilterChain เข้ามาวัตถุ FilterChain เป็นวัตถุที่สำคัญที่สุดในอินเทอร์เฟซตัวกรอง นอกจากนี้ยังมีวิธี Dofilter นักพัฒนาสามารถตัดสินใจได้ว่าจะเรียกวิธีนี้ตามความต้องการของพวกเขาหรือไม่ หากวิธีการนี้ถูกเรียกเว็บเซิร์ฟเวอร์จะเรียกวิธีการบริการของทรัพยากรเว็บนั่นคือทรัพยากรเว็บจะถูกเข้าถึงมิฉะนั้นทรัพยากรเว็บจะไม่สามารถเข้าถึงได้
3. การเริ่มต้นด้วยการพัฒนาตัวกรอง
3.1. ขั้นตอนการพัฒนาตัวกรอง
การพัฒนาตัวกรองแบ่งออกเป็นสองขั้นตอน:
1. เขียนคลาส Java เพื่อใช้อินเตอร์เฟสตัวกรองและใช้วิธี Dofilter
2. ใช้องค์ประกอบ <filter> และ <stilter-mapping> ในไฟล์ web.xml เพื่อลงทะเบียนคลาสตัวกรองที่เป็นลายลักษณ์อักษรและตั้งค่าทรัพยากรที่สามารถสกัดกั้นได้
ตัวอย่างตัวกรอง:
แพ็คเกจ me.gacl.web.filter; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.filter; นำเข้า javax.servlet.filterchain; นำเข้า Javax.servlet.filterconfig; นำเข้า Javax.servlet.servletexception; javax.servlet.servletResponse;/*** @classname: FilterDemo*@description: แอปพลิเคชันทั่วไปสามแอปพลิเคชันของตัวกรอง:*คุณสามารถตัดสินใจได้ว่าจะโทรไปที่เชน ดำเนินการผลลัพธ์การดำเนินการของทรัพยากรเป้าหมายสามารถจับได้ดังนั้นจึงตระหนักถึงฟังก์ชั่นพิเศษบางอย่าง* @author: 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小�การตอบสนอง, ห่วงโซ่ฟิลเตอร์เชน) โยน ioexception, servletexception {// โปรดประมวลผลล่วงหน้าตามคำขอและการตอบสนอง request.setcharacterencoding ("UTF-"); Response.Setcharacterencoding ("UTF-"); Response.SetContentType ("ข้อความ/html; charset = utf-"); system.out.println ("FilterDemo ก่อนการดำเนินการ !!!"); // ให้ทรัพยากรเป้าหมายดำเนินการและปล่อย System.out.println ("FilterDemo หลังจากดำเนินการ!!");}@overridepublic เป็นโมฆะทำลาย () {system.out.println ("---- การทำลายตัวกรอง ----");}}}} กำหนดค่าตัวกรองใน web.xml:
<? xml version = "." encoding = "utf-"?> <web-app version = "." xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w.org//xmlschema-instance" xsi: schemalocation = "http://java.sun.sun http://java.sun.com/xml/ns/javaee/web-app__.xsd "> <display-name> </display-name> <welcome-file-list> <welcome-file> index.jsp </welcome-file> ตัวกรอง-> <filter> <filter-name> FilterDemo </filter-name> <silter-class> me.gacl.web.filter.filterdemo </filter-class> </filter> <! คำขอ-> <url-pattern>/*</url-pattern> </ตัวกรอง-การแม็ค> </eb-app>
3.2. ห่วงโซ่กรอง
ในเว็บแอปพลิเคชันตัวกรองหลายตัวสามารถพัฒนาและเขียนซึ่งรวมกันเป็นห่วงโซ่ตัวกรองเดียว
เว็บเซิร์ฟเวอร์ตัดสินใจว่าตัวกรองใดที่จะโทรก่อนตามลำดับที่ตัวกรองลงทะเบียนในไฟล์ web.xml เมื่อมีการเรียกใช้วิธี Dofilter ของตัวกรองแรกเว็บเซิร์ฟเวอร์จะสร้างวัตถุ FilterChain ที่แสดงถึงห่วงโซ่ตัวกรองและส่งผ่านไปยังวิธีการ ในวิธี Dofilter หากนักพัฒนาเรียกใช้วิธี Dofilter ของวัตถุ FilterChain เว็บเซิร์ฟเวอร์จะตรวจสอบว่ายังมีตัวกรองในวัตถุ FilterChain หรือไม่ หากมีตัวกรองที่สองจะถูกเรียกและหากไม่มีทรัพยากรเป้าหมายจะถูกเรียก
4. วงจรชีวิตของตัวกรอง
4.1. การสร้างตัวกรอง
การสร้างและทำลายตัวกรองเป็นความรับผิดชอบของเว็บเซิร์ฟเวอร์ เมื่อเว็บแอปพลิเคชันเริ่มต้นเว็บเซิร์ฟเวอร์จะสร้างวัตถุอินสแตนซ์ของตัวกรองและเรียกใช้วิธีการเริ่มต้นเพื่อให้ฟังก์ชั่นการเริ่มต้นของวัตถุสมบูรณ์ซึ่งจะเตรียมการสกัดกั้นสำหรับคำขอของผู้ใช้ที่ตามมา วัตถุตัวกรองจะถูกสร้างขึ้นเพียงครั้งเดียวและวิธีการเริ่มต้นจะถูกดำเนินการเพียงครั้งเดียว ผ่านพารามิเตอร์ของวิธีการเริ่มต้นวัตถุ FilterConfig ที่แสดงข้อมูลการกำหนดค่าตัวกรองปัจจุบันสามารถรับได้
4.2. การทำลายตัวกรอง
เว็บคอนเทนเนอร์เรียกวิธีการทำลายเพื่อทำลายตัวกรอง วิธีการทำลายจะถูกดำเนินการเพียงครั้งเดียวในช่วงวงจรชีวิตของตัวกรอง ในวิธีการทำลายทรัพยากรที่ใช้โดยตัวกรองสามารถปลดปล่อยได้
4.3. อินเทอร์เฟซ FilterConfig
เมื่อกำหนดค่าตัวกรองผู้ใช้สามารถใช้ <int-Param> เพื่อกำหนดค่าพารามิเตอร์การเริ่มต้นบางอย่างสำหรับตัวกรอง เมื่อเว็บคอนเทนเนอร์พิงวัตถุตัวกรองและเรียกใช้วิธีการเริ่มต้นวัตถุ FilterConfig จะห่อหุ้มพารามิเตอร์การเริ่มต้นตัวกรองจะถูกส่งผ่านดังนั้นเมื่อนักพัฒนาเขียนตัวกรองพวกเขาจะได้รับ:
String getFiltername (): รับชื่อของตัวกรอง
String getInitParameter (ชื่อสตริง): ส่งคืนค่าของพารามิเตอร์การเริ่มต้นด้วยชื่อที่ระบุในคำอธิบายการปรับใช้ ส่งคืนค่า null ถ้าไม่มีอยู่
การแจงนับ getinitparameternames (): ส่งคืนชุดการแจงนับชื่อของพารามิเตอร์การเริ่มต้นทั้งหมดของตัวกรอง
Public ServletContext GetServletContext (): ส่งคืนการอ้างอิงไปยังวัตถุบริบท servlet
ตัวอย่าง: ใช้ FilterConfig เพื่อรับข้อมูลการกำหนดค่าตัวกรอง
แพ็คเกจ me.gacl.web.filter; นำเข้า java.io.ioexception; นำเข้า java.util.enumeration; นำเข้า javax.servlet.filter; นำเข้า Javax.servlet.filterchain; นำเข้า Javax.servlet.filterconfig; javax.servlet.servletResponse; คลาสสาธารณะ FilterDemo ใช้ตัวกรอง {/* การเริ่มต้นตัวกรอง* @see Javax.servlet.filter#init (javax.servlet.filterconfig)*/ @overridepublic การเริ่มต้น ---- ");/*** <ฟิลเตอร์> <filter-name> FilterDemo </filter-name> <tilter-class> me.gacl.web.filter.filterdemo </ตัวกรอง-คลาส> <!-กำหนดค่าพารามิเตอร์การเริ่มต้นของตัวกรองฟิลเตอร์ ตัวกรอง </คำอธิบาย> <param-name> ชื่อ </param-name> <param-value> GACL </param-value> </init-param> <int-p aram> <scription> กำหนดค่าพารามิเตอร์การเริ่มต้นของ FilterDemo ตัวกรอง </คำอธิบาย> <param-name> เช่น </param-name> <param-value> java </param-value> </init-param> </filter> <filter-mapping> <filter-name> filterdemo </filter-name> สตริงชื่อของตัวกรอง filtername = filterConfig.getFiltername (); // รับพารามิเตอร์การเริ่มต้นที่กำหนดค่าในสตริงไฟล์ web.xml initparam = filterConfig.getInitParameter ("ชื่อ"); String InitParam = FilterConfig.getInitParameter ("Like"); // ส่งคืนชุดการแจงนับชื่อของพารามิเตอร์การเริ่มต้นทั้งหมดของตัวกรอง การแจงนับ <String> InitParametERNAMES = FilterConfig.getInitParameterNames (); System.out.println (filtername); System.out.println (initparam); System.out.println (initparam); system.out.println (initparam); ในขณะที่ (initparameternames.hasmoreElements ()) {string paramname = (string) initparameternames.nextelement (); system.out.println (paramname);}}@overridepublic dofilter {System.out.println ("FilterDemo ก่อนการดำเนินการ !!!"); chain.dofilter (คำขอ, การตอบกลับ); // ให้ทรัพยากรเป้าหมายถูกดำเนินการและ System.out.println ("FilterDemo หลังจากดำเนินการ !!!");}@overridepublic Void Destroy () {system.out.println ("--- การทำลายตัวกรอง ----");}}}; 5. การปรับใช้ตัวกรอง
การปรับใช้ตัวกรองแบ่งออกเป็นสองขั้นตอน:
1. ตัวกรองลงทะเบียน
2. ตัวกรองการทำแผนที่
5.1. ตัวกรองลงทะเบียน
หลังจากพัฒนาตัวกรองคุณต้องลงทะเบียนในไฟล์ web.xml เพื่อให้คุณสามารถเรียกใช้เว็บเซิร์ฟเวอร์ได้
ลงทะเบียนตัวอย่างตัวกรองในไฟล์ web.xml:
<Tilter> <SecutionS> ตัวกรอง FilterDemo </คำอธิบาย> <filter-Name> FilterDemo </filter-name> <silter-class> me.gacl.web.filter.filterdemo </ตัวกรอง-class> <! RIPT> <param-Name> ชื่อ </param-name> <param-value> GACL </param-value> </init-param> <init-Param> <scription> กำหนดค่าพารามิเตอร์การเริ่มต้นของตัวกรองตัวกรอง </คำอธิบาย> <param-name> เช่น </param-name>
<Scription> ใช้เพื่อเพิ่มข้อมูลคำอธิบาย เนื้อหาขององค์ประกอบนี้อาจว่างเปล่าและไม่สามารถกำหนดค่าได้ <คำอธิบาย>
<filter-name> ใช้เพื่อระบุชื่อสำหรับตัวกรองและเนื้อหาขององค์ประกอบไม่สามารถว่างเปล่าได้
องค์ประกอบ <silter-class> ใช้เพื่อระบุชื่อคลาสที่ผ่านการรับรองที่สมบูรณ์ของตัวกรอง
องค์ประกอบ <int-param> ใช้เพื่อระบุพารามิเตอร์การเริ่มต้นสำหรับตัวกรองและองค์ประกอบลูก <param-name> ระบุชื่อของพารามิเตอร์และ <param- value> ระบุค่าของพารามิเตอร์ ในตัวกรองพารามิเตอร์การเริ่มต้นสามารถเข้าถึงได้โดยใช้วัตถุอินเตอร์เฟส FilterConfig หากตัวกรองไม่จำเป็นต้องระบุพารามิเตอร์การเริ่มต้นองค์ประกอบ <int-param> อาจไม่ได้รับการกำหนดค่า
5.2. การทำแผนที่ตัวกรอง
หลังจากลงทะเบียนตัวกรองในไฟล์ web.xml คุณต้องทำแผนที่ตัวกรองในไฟล์ web.xml
<!-ตัวกรองการแม็พ-> <ฟิลเตอร์-แมป> <filter-name> ตัวกรอง </filter-name> <!-"/*" หมายถึงการสกัดกั้นคำขอทั้งหมด-> <url-pattern>/*</url-pattern>
องค์ประกอบ <mapping> ตัวกรองถูกใช้เพื่อตั้งค่าทรัพยากรที่ตัวกรองรับผิดชอบการสกัดกั้น สามารถระบุทรัพยากรตัวกรองได้สองวิธี: ชื่อ servlet และเส้นทางคำขอสำหรับการเข้าถึงทรัพยากร
องค์ประกอบเด็ก <Tilter-name> ใช้เพื่อตั้งค่าชื่อการลงทะเบียนของตัวกรอง ค่านี้จะต้องเป็นชื่อของตัวกรองที่ประกาศในองค์ประกอบ <url-pattern> ตั้งค่าเส้นทางการร้องขอที่สกัดด้วยตัวกรอง (รูปแบบ URL ที่เกี่ยวข้องกับตัวกรอง)
<servlet-name> ระบุชื่อของ servlet ที่สกัดกั้นโดยตัวกรอง
<dispatcher> ระบุวิธีที่ทรัพยากรที่สกัดกั้นโดยตัวกรองถูกเรียกโดยคอนเทนเนอร์ servlet อาจเป็นหนึ่งในคำขอรวมการส่งต่อและข้อผิดพลาดและคำขอเริ่มต้น ผู้ใช้สามารถตั้งค่าองค์ประกอบย่อย <dispatcher> หลายตัวเพื่อระบุ
ตัวกรองสกัดกั้นวิธีการโทรหาทรัพยากรต่างๆ ดังนี้:
<sider-mapping> <filter-name> testFilter </filter-name> <url-pattern> /index.jsp </url-pattern> <ispatcher> คำขอ </dispatcher> <ispatcher> ส่งต่อ </dispatcher>
ค่าที่องค์ประกอบเด็กสามารถตั้งค่าและความหมายของพวกเขา:
1. ต้องการ: เมื่อผู้ใช้เข้าถึงหน้าโดยตรงเว็บคอนเทนเนอร์จะเรียกตัวกรอง หากทรัพยากรเป้าหมายถูกเข้าถึงผ่านวิธีการรวม () หรือ forward () ของ RequestDispatcher ตัวกรองจะไม่ถูกเรียก
2. รวม: หากมีการเข้าถึงทรัพยากรเป้าหมายผ่านวิธีการรวม () ของ RequestDispatcher ตัวกรองจะถูกเรียก นอกเหนือจากนั้นตัวกรองจะไม่ถูกเรียก
3. ไปข้างหน้า: หากมีการเข้าถึงทรัพยากรเป้าหมายผ่านวิธีการส่งต่อ () ของ RequestDispatcher ตัวกรองจะถูกเรียกและตัวกรองจะไม่ถูกเรียกนอกจากนี้
4.Error: หากทรัพยากรเป้าหมายถูกเรียกผ่านกลไกการจัดการข้อยกเว้นการประกาศตัวกรองจะถูกเรียก นอกเหนือจากนั้นตัวกรองจะไม่ถูกเรียก