รู้เบื้องต้นเกี่ยวกับตัวกรอง
ตัวกรองเรียกอีกอย่างว่าตัวกรอง มันเป็นเทคโนโลยีที่ใช้งานได้จริงที่สุดในเทคโนโลยีเซิร์ฟเล็ต ด้วยเทคโนโลยีตัวกรองนักพัฒนาเว็บจะสกัดกั้นทรัพยากรเว็บทั้งหมดที่จัดการโดยเว็บเซิร์ฟเวอร์: เช่น JSP, Servlet, ไฟล์ภาพคงที่หรือไฟล์ HTML แบบคงที่ซึ่งจะได้รับฟังก์ชั่นพิเศษบางอย่าง ตัวอย่างเช่นใช้ฟังก์ชั่นขั้นสูงบางอย่างเช่นการควบคุมการเข้าถึงการอนุญาตระดับ URL, การกรองคำศัพท์ที่ละเอียดอ่อนและข้อมูลการตอบสนองการบีบอัด
ส่วนใหญ่จะใช้ในการประมวลผลคำขอของผู้ใช้ล่วงหน้าและยังสามารถโพสต์ httpservletResponse ได้ กระบวนการที่สมบูรณ์ของการใช้ตัวกรอง: ตัวกรองการประมวลผลผู้ใช้ล่วงหน้าจากนั้นส่งคำขอไปยัง Servlet สำหรับการประมวลผลและสร้างการตอบกลับ
ฟังก์ชันตัวกรอง
1. สกัดกั้น httpservletrequest ของลูกค้าก่อนที่ HttpservletRequest จะมาถึงที่ servlet ตรวจสอบ HTTPSERVLETREQUEST ตามต้องการและคุณยังสามารถแก้ไขส่วนหัวและข้อมูล HTTPSERVLEDREQUEST และข้อมูลได้
2. สกัดกั้น httpservletResponse ก่อนที่จะถึงไคลเอนต์ ตรวจสอบ httpservletResponse ตามต้องการและคุณยังสามารถแก้ไขส่วนหัวและข้อมูล HTTPSERVLESSESSESSENS และข้อมูลได้
วิธีใช้ตัวกรองเพื่อใช้ฟังก์ชันการสกัดกั้น
มีวิธี Dofilter ในอินเทอร์เฟซตัวกรอง เมื่อผู้พัฒนาเขียนตัวกรองและกำหนดค่าทรัพยากรเว็บที่จะสกัดกั้นเว็บเซิร์ฟเวอร์จะเรียกใช้วิธี Dofilter ของตัวกรองทุกครั้งก่อนที่จะเรียกใช้วิธีการบริการของทรัพยากรเว็บ ดังนั้นการเขียนโค้ดในวิธีนี้สามารถบรรลุวัตถุประสงค์ต่อไปนี้:
1. ให้โค้ดชิ้นหนึ่งดำเนินการก่อนเรียกทรัพยากรเป้าหมาย
2. ไม่ว่าจะเรียกทรัพยากรเป้าหมายหรือไม่ (นั่นคือไม่ว่าจะอนุญาตให้ผู้ใช้เข้าถึงทรัพยากรเว็บ)
เมื่อเว็บเซิร์ฟเวอร์เรียกวิธี Dofilter มันจะผ่านวัตถุ FilterChain เข้ามาวัตถุ FilterChain เป็นวัตถุที่สำคัญที่สุดในอินเทอร์เฟซตัวกรอง นอกจากนี้ยังมีวิธี Dofilter นักพัฒนาสามารถตัดสินใจได้ว่าจะเรียกวิธีนี้ตามความต้องการของพวกเขาหรือไม่ หากวิธีการนี้ถูกเรียกเว็บเซิร์ฟเวอร์จะเรียกวิธีการบริการของทรัพยากรเว็บนั่นคือทรัพยากรเว็บจะถูกเข้าถึงมิฉะนั้นทรัพยากรเว็บจะไม่สามารถเข้าถึงได้
การพัฒนาตัวกรองสองขั้นตอน
เขียนคลาส Java เพื่อใช้อินเทอร์เฟซตัวกรองและใช้วิธี Dofilter
ใช้และองค์ประกอบในไฟล์ web.xml เพื่อลงทะเบียนคลาสตัวกรองที่เขียนและตั้งค่าทรัพยากรที่สามารถสกัดกั้นได้
รู้เบื้องต้นเกี่ยวกับ web.xml โหนดการกำหนดค่า:
องค์ประกอบ <mapping> ตัวกรองถูกใช้เพื่อตั้งค่าทรัพยากรที่ตัวกรองรับผิดชอบการสกัดกั้น สามารถระบุทรัพยากรตัวกรองได้สองวิธี: ชื่อ servlet และเส้นทางคำขอสำหรับการเข้าถึงทรัพยากร
<servlet-name> ระบุชื่อของ servlet ที่สกัดกั้นโดยตัวกรอง
<dispatcher> ระบุวิธีที่ทรัพยากรที่สกัดกั้นโดยตัวกรองถูกเรียกโดยคอนเทนเนอร์ servlet อาจเป็นหนึ่งในคำขอรวมการส่งต่อและข้อผิดพลาดและคำขอเริ่มต้น ผู้ใช้สามารถตั้งค่าหลายองค์ประกอบ <dispatcher> เพื่อระบุตัวกรองเพื่อสกัดกั้นวิธีการโทรต่าง ๆ
คุณค่าและความหมายขององค์ประกอบเด็กสามารถตั้งค่าได้มีดังนี้
ห่วงโซ่กรอง
ในเว็บแอปพลิเคชันตัวกรองหลายตัวสามารถพัฒนาและเขียนซึ่งรวมกันเป็นห่วงโซ่ตัวกรองเดียว
เว็บเซิร์ฟเวอร์ตัดสินใจว่าตัวกรองใดที่จะโทรก่อนตามลำดับที่ตัวกรองลงทะเบียนในไฟล์ web.xml เมื่อมีการเรียกใช้วิธี Dofilter ของตัวกรองแรกเว็บเซิร์ฟเวอร์จะสร้างวัตถุ FilterChain ที่แสดงถึงห่วงโซ่ตัวกรองและส่งผ่านไปยังวิธีการ ในวิธี Dofilter หากนักพัฒนาเรียกใช้วิธี Dofilter ของวัตถุ FilterChain เว็บเซิร์ฟเวอร์จะตรวจสอบว่ายังมีตัวกรองในวัตถุ FilterChain หรือไม่ หากมีตัวกรองที่สองจะถูกเรียกและหากไม่มีทรัพยากรเป้าหมายจะถูกเรียก
วงจรชีวิตของตัวกรอง
Public Void Init (FilterConfig FilterConfig) โยน servletexception; // การเริ่มต้น
เช่นเดียวกับโปรแกรม servlet ที่เราเขียนการสร้างและการทำลายตัวกรองเป็นความรับผิดชอบของเว็บเซิร์ฟเวอร์ เมื่อเว็บแอปพลิเคชันเริ่มต้นเว็บเซิร์ฟเวอร์จะสร้างวัตถุอินสแตนซ์ของตัวกรองและเรียกใช้วิธีการเริ่มต้นเพื่ออ่านการกำหนดค่า web.xml เพื่อให้ฟังก์ชั่นการเริ่มต้นวัตถุเสร็จสิ้นดังนั้นจึงเตรียมการสกัดกั้นสำหรับคำขอของผู้ใช้ที่ตามมา (วัตถุตัวกรองจะถูกสร้างเพียงครั้งเดียว นักพัฒนาสามารถรับวัตถุ FilterConfig ที่แสดงข้อมูลการกำหนดค่าตัวกรองปัจจุบันผ่านพารามิเตอร์ของวิธีการเริ่มต้น
โมฆะสาธารณะ dofilter (คำขอ servletrequest, การตอบสนอง servletresponse, chain filterchain) โยน ioexception, servletexception; // คำขอสกัดกั้น
วิธีนี้เสร็จสิ้นการดำเนินการกรองจริง เมื่อไคลเอนต์ร้องขอการเข้าถึง URL ที่เชื่อมโยงกับตัวกรองตัวกรอง servlet จะเรียกใช้วิธี Dofilter ก่อน พารามิเตอร์ FilterChain ใช้เพื่อเข้าถึงตัวกรองที่ตามมา
โมฆะสาธารณะทำลาย (); // ทำลาย
วัตถุตัวกรองจะอยู่ในหน่วยความจำหลังจากการสร้างและจะถูกทำลายเมื่อเว็บแอปพลิเคชันถูกลบออกหรือเซิร์ฟเวอร์หยุดลง เรียกก่อนหน้าเว็บคอนเทนเนอร์ถอนการติดตั้งวัตถุตัวกรอง วิธีนี้ดำเนินการเพียงครั้งเดียวในช่วงวงจรชีวิตของตัวกรอง ในวิธีนี้ทรัพยากรที่ใช้โดยตัวกรองสามารถปลดปล่อยได้
อินเทอร์เฟซ FilterConfig
เมื่อกำหนดค่าตัวกรองผู้ใช้สามารถกำหนดค่าพารามิเตอร์การเริ่มต้นบางอย่างสำหรับตัวกรอง เมื่อเว็บคอนเทนเนอร์พิงวัตถุตัวกรองและเรียกใช้วิธีการเริ่มต้นมันจะผ่านในวัตถุ FilterConfig ที่ห่อหุ้มพารามิเตอร์การเริ่มต้นตัวกรอง ดังนั้นเมื่อนักพัฒนาเขียนตัวกรองพวกเขาสามารถรับเนื้อหาต่อไปนี้ผ่านวิธีการ FilterConfig Object:
String getFiltername (); // รับชื่อตัวกรอง String getInitParameter (ชื่อสตริง); // ส่งคืนค่าของพารามิเตอร์การเริ่มต้นด้วยชื่อที่ระบุในคำอธิบายการปรับใช้ หากไม่มีการดำรงอยู่ให้กลับมาเป็นโมฆะ การแจงนับ getinitparameternames (); // ส่งคืนชุดการแจงนับชื่อของพารามิเตอร์การเริ่มต้นทั้งหมดของตัวกรอง Public ServletContext GetServletContext (); // ส่งคืนการอ้างอิงไปยังวัตถุบริบท servlet
กรณีการใช้ตัวกรอง
ใช้ตัวกรองเพื่อตรวจสอบการควบคุมความปลอดภัยของผู้ใช้
ฉันเข้าร่วมในการบำรุงรักษาโครงการเมื่อไม่นานมานี้ หลังจากผู้ใช้ออกจากระบบเขาไปที่แถบที่อยู่เพื่อเข้าถึงประวัติ ตาม URL เขายังสามารถเข้าสู่หน้าการตอบสนองของระบบได้ ฉันตรวจสอบและพบว่าคำขอไม่ได้ถูกกรองและตรวจสอบว่าการเข้าสู่ระบบของผู้ใช้ถูกลงชื่อเข้าใช้เพิ่มตัวกรองเพื่อแก้ปัญหา!
แรกกำหนดค่าใน web.xml
<silter> <sider-Name> SessionFilter </filter-name> <silter-class> com.action.login.sessionfilter </filter-class> <init-param> <param-name> logonstrings </param-name> <!-ไม่กรองหน้าเข้าสู่ระบบ-> <int-Param> <param-Name> includeStrings </param-name> <!-ตัวกรองเฉพาะคำต่อท้ายพารามิเตอร์ตัวกรองที่ระบุ-> <param-value> .do; .jsp </param-value> </init-param> <param-value> /index.jsp </param-value> </init-param> <init-Param> <param-Name> DisableTestFilter </param-name> <!-y: ตัวกรอง invalid-> <param-value> n </param-value> <! </init-param> </filter> <filter-mapping> <filter-name> sessionfilter </filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
จากนั้นเขียน filterservlet.java:
แพ็คเกจ com.action.login; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.filter; นำเข้า Javax.servlet.filterchain; นำเข้า Javax.servlet.filterconfig; นำเข้า Javax.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet.servlet javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า Javax.servlet.http.httpservletReswrapper; http://www.manongjc.com/article/1613.html */คลาสสาธารณะเซสชัน Filter ใช้ตัวกรอง {public filterConfig config; โมฆะสาธารณะทำลาย () {this.config = null; } public boolean isContains (สตริงคอนเทนเนอร์, string [] regx) {boolean result = false; สำหรับ (int i = 0; i <regx.length; i ++) {ถ้า (container.indexof (regx [i])! = -1) {return true; }} ผลการส่งคืน; } โมฆะสาธารณะ dofilter (คำขอ ServletRequest, การตอบสนอง servletResponse, ห่วงโซ่ FilterChain) พ่น IOException, servletexception {httpservletRequest hrequest = (httpservletrequest) คำขอ; httpservleSponSewRapper wrapper = ใหม่ httpservleStResponSewRapper ((httpservletResponse) การตอบสนอง); String logonstrings = config.getInitParameter ("logonstrings"); // เข้าสู่ระบบเพื่อเข้าสู่ระบบสตริงหน้า includeStrings = config.getInitParameter ("includeStrings"); // ตัวกรองทรัพยากรพารามิเตอร์คำต่อท้ายสตริง RedirectPath = hrequest.getContextPath () + config.getInitParameter ("redirectPath"); // ไม่มีการเข้าสู่ระบบไปยังสตริงหน้าปิด disableTestFilter = config.getInitParameter ("disableTestFilter"); // เป็นตัวกรองที่ถูกต้องถ้า (disableTestFilter.touppercase () เท่ากับ ("y")) กลับ; } string [] logonList = logonstrings.split (";"); String [] includeList = includesTrings.split (";"); if (! this.iscontains (hrequest.getRequesturi (), includeList)) {// จะกรองเฉพาะพารามิเตอร์ตัวกรองที่ระบุ quast chain.dofilter (คำขอ, การตอบสนอง); กลับ; } if (this.iscontains (hrequest.getRequesturi (), logonList)) {// อย่ากรองหน้าเข้าสู่ระบบ chain.dofilter (คำขอ, การตอบสนอง); กลับ; } string user = (string) hrequest.getSession (). getAttribute ("useronly"); // ตัดสินว่าผู้ใช้จะเข้าสู่ระบบถ้า (user == null) {wrapper.sendrect (redirectPath); กลับ; } else {chain.dofilter (คำขอ, การตอบกลับ); กลับ; }} public void init (filterConfig filterConfig) พ่น servletexception {config = filterConfig; -ด้วยวิธีนี้คำขอทั้งหมดไปยังผู้ใช้สามารถเสร็จสิ้นและการเข้าสู่ระบบของผู้ใช้จะต้องได้รับการตรวจสอบผ่านตัวกรองนี้
ป้องกันตัวกรองที่อ่านไม่ออกภาษาจีน
เมื่อโครงการใช้กรอบสปริง เมื่อมีการใช้ชุดอักขระที่แตกต่างกันในหน้า JSP ปัจจุบันและรหัส Java สำหรับการเข้ารหัสจะมีปัญหาที่อ่านไม่ออกด้วยข้อมูลที่ส่งแบบฟอร์มหรืออัปโหลด/ดาวน์โหลดไฟล์ชื่อภาษาจีน จากนั้นคุณสามารถใช้ตัวกรองนี้
<silter> <melter-name> การเข้ารหัส </filter-name> <silter-class> org.springframework.web.filter.characterencodingfilter </filter-class> <init-param> <param-name> </init-param> <int-Param> <param-Name> ForceEncoding </param-name> <!-จริง: ไม่ว่าคำขอจะระบุชุดอักขระหรือไม่ FALSE: หากคำขอได้ระบุชุดอักขระการเข้ารหัสจะไม่ถูกใช้-> <param- value> false </param-value> </init-param> </filter> <sider-mapping>
Spring+Hibernate's OpenSessionInviewFilter ควบคุมสวิตช์ของเซสชัน
เมื่อใช้ไฮเบอร์เนต+สปริงร่วมกับมันถ้า lazy = true ถูกตั้งค่า (การโหลดล่าช้า) จากนั้นเมื่ออ่านข้อมูล Hibernate จะปิดเซสชันโดยอัตโนมัติหลังจากอ่านข้อมูลหลัก ด้วยวิธีนี้เมื่อคุณต้องการใช้ข้อมูลที่เกี่ยวข้องและข้อมูลเด็กระบบจะส่งข้อผิดพลาด lazyinit ในเวลานี้คุณต้องใช้ตัวกรอง OpenSessionInviewFilter ที่จัดทำโดย Spring
OpenSessionInviewFilter ส่วนใหญ่จะรักษาสถานะเซสชันจนกว่าคำขอจะส่งหน้าทั้งหมดไปยังลูกค้าและไม่ปิดเซสชันจนกว่าคำขอจะเสร็จสมบูรณ์เพื่อแก้ปัญหาที่เกิดจากการโหลดขี้เกียจ
หมายเหตุ: การกำหนดค่า OpenSessionInViewFilter ควรเขียนไว้ที่ด้านหน้าของการกำหนดค่าของ struts2 เนื่องจากคอนเทนเนอร์ Tomcat ถูกโหลดตามลำดับเมื่อโหลดตัวกรองหากไฟล์การกำหนดค่าเป็นครั้งแรกที่เขียนการกำหนดค่าตัวกรองของ struts2 จากนั้น OpenSessionInviewFilter การกำหนดค่าการกำหนดค่าตัวกรองการโหลดจะส่งผลให้เซสชันไม่ได้รับการจัดการโดยสปริงเมื่อได้รับข้อมูล
<Tilter> <!-เปิดใช้งานการโหลดขี้เกียจในฤดูใบไม้ผลิ-> <filter-Name> OpenSessionInViewFilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.opensessionInviewFilter </filter-class> โดยค่าเริ่มต้นถั่วที่มี ID เป็น SessionFactory จากคอนเทนเนอร์สปริง หาก ID ไม่ใช่ SessionFactory คุณจะต้องกำหนดค่าดังนี้ ที่นี่ SessionFactory เป็นถั่วในภาชนะฤดูใบไม้ผลิ -> <param-value> SessionFactory </param-value> </init-Param> <init-Param> <param-Name> Singlesession </param-name> <!-ค่าเริ่มต้นของ Singlesession เป็นจริงหากตั้งค่าเป็นเท็จ <Tilter-Name> OpenSessionInViewFilter </filter-name> <url-pattern>*. ทำ </url-pattern> </ตัวกรอง-การทำแผนที่>
การกำหนดค่า web.xml ของ struts2
ในการใช้ Struts2 ในโครงการคุณต้องกำหนดค่าตัวกรองใน web.xml เพื่อสกัดกั้นคำขอและไปที่การกระทำของ Struts2 สำหรับการประมวลผล
หมายเหตุ: หากอยู่ในรุ่น struts2 ก่อน 2.1.3 ตัวกรองจะใช้ org.apache.struts2.dispatcher.filterdispatcher มิฉะนั้นใช้ org.apache.struts2.dispatcher.ng.filter.strutspreprepareandexecutefilter เริ่มต้นด้วย struts 2.1.3 ตัวกรอง ActionContextCleanup จะถูกทอดทิ้งในขณะที่ฟังก์ชั่นที่สอดคล้องกันจะรวมอยู่ในตัวกรอง strutsprepeprepareedexecutefilter
มีการกำหนดค่าพารามิเตอร์การเริ่มต้นสามแบบ:
<!-struts 2.x ตัวกรอง-> <filter> <tilter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </filter-class> </filter> <url-pattern>*. Do </url-pattern> </ตัวกรอง-การทำแผนที่>
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!