วิธีกำหนดลำดับตัวกรองเซิร์ฟเล็ตของการดำเนินการโดยใช้หมายเหตุประกอบใน WAR


167

ถ้าเรากำหนด webapp ฟิลเตอร์ที่เฉพาะเจาะจงเซิร์ฟเล็ตในสงครามของตัวเองแล้วคำสั่งของการดำเนินการของฟิลเตอร์จะเป็นเช่นเดียวกับคำสั่งในการที่พวกเขาจะถูกกำหนดไว้ในweb.xmlweb.xml

แต่ถ้าเรากำหนดตัวกรองเหล่านั้นโดยใช้@WebFilterคำอธิบายประกอบลำดับของการดำเนินการของตัวกรองคืออะไรและเราจะกำหนดลำดับของการดำเนินการได้อย่างไร

คำตอบ:


187

คุณไม่สามารถกำหนดลำดับการดำเนินการตัวกรองได้โดยใช้@WebFilterคำอธิบายประกอบ อย่างไรก็ตามเพื่อลดการweb.xmlใช้งานให้น้อยที่สุดก็เพียงพอแล้วที่จะเพิ่มคำอธิบายประกอบตัวกรองทั้งหมดด้วยเพียงfilterNameเพื่อให้คุณไม่ต้องการ<filter>คำจำกัดความ แต่เป็นเพียง<filter-mapping>คำจำกัดความตามลำดับที่ต้องการ

ตัวอย่างเช่น,

@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}

ด้วยweb.xmlเพียงแค่นี้:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/url1/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/url2/*</url-pattern>
</filter-mapping>

หากคุณต้องการเก็บรูปแบบ URL ไว้@WebFilterคุณก็สามารถทำได้

@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}

แต่คุณควรจะยังคง<url-pattern>อยู่ในweb.xmlเพราะมันเป็นต่อ XSD แม้ว่ามันจะว่างเปล่า:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern />
</filter-mapping>

โดยไม่คำนึงถึงวิธีการทั้งหมดนี้จะล้มเหลวในการ Tomcat จนถึงรุ่น 7.0.28 เพราะมันฉายาในการปรากฏตัวของโดยไม่ต้อง<filter-mapping> <filter>ดูเพิ่มเติมที่การใช้ Tomcat @WebFilter ไม่ทำงานกับ <filter-mapping> ข้างใน web.xml


5
พวกเขาสามารถแนะนำorderคุณลักษณะของ@WebFilterMappingคำอธิบายประกอบแบบซ้อนได้ ฉันสงสัยว่าคนที่ทำไม่ได้ทำเพื่อความเรียบง่ายหรือไม่
Bozho

12
@Bozho: นั่นคงไม่เจาะจงพอ จะเกิดอะไรขึ้นถ้าเว็บแอปของคุณมาพร้อมกับห้องสมุดบุคคลที่สามซึ่งมีตัวกรอง เป็นการยากที่จะบอกล่วงหน้า
BalusC

1
@BalusC: มีบางอย่างผิดพลาดในตัวอย่างของคุณ: รูปแบบ URL ถูกปิดด้วยชื่อตัวกรอง
AndrewBourgeois

3
@AndrewBourgeois: แก้ไข เกิดข้อผิดพลาดในการคัดลอก น่าเสียดายที่ตัวแก้ไข Markdown ไม่มีการตรวจสอบ XML ในตัวเหมือนกับใน Eclipse;)
BalusC

6
การใช้งาน<url-pattern />ไม่ได้กับ JBoss EAP 6.1 - มันจะแทนที่@WebFilterค่าและป้องกันไม่ให้ตัวกรองทำงานเลย
seanf

12

ข้อมูลจำเพาะของ Servlet 3.0 ดูเหมือนจะไม่ได้ให้คำแนะนำเกี่ยวกับวิธีที่คอนเทนเนอร์ควรสั่งตัวกรองที่ถูกประกาศผ่านคำอธิบายประกอบ มีความชัดเจนเกี่ยวกับวิธีการสั่งซื้อตัวกรองผ่านการประกาศในไฟล์ web.xml

ปลอดภัย. ใช้ตัวกรองลำดับไฟล์ web.xml ที่มีการพึ่งพาซึ่งกันและกัน พยายามทำให้ตัวกรองของคุณทั้งหมดเป็นอิสระเพื่อลดความจำเป็นในการใช้ไฟล์ web.xml


4
ฉันมีตัวกรอง Servlet จำนวนมากในโครงการของฉันพวกเขาจะต้องเรียกตัวกรองเฉพาะก่อนและลำดับตัวกรองอื่น ๆ ไม่ใช่สิ่งที่กังวล ฉันต้องทำให้ตัวกรองทั้งหมดสกปรกใน web.xml หรือไม่ หรือมีทางลัดใด ๆ ?
siva636
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.