Cara menetapkan urutan eksekusi servlet filter menggunakan anotasi dalam WAR


167

Jika kami menetapkan filter servlet spesifik webapp di WAR sendiri web.xml, maka urutan eksekusi filter akan sama dengan urutan yang didefinisikan dalam web.xml.

Tetapi, jika kita mendefinisikan filter tersebut menggunakan @WebFilteranotasi, bagaimana urutan eksekusi filter, dan bagaimana kita dapat menentukan urutan eksekusi?

Jawaban:


187

Anda memang tidak dapat menentukan urutan eksekusi filter menggunakan @WebFilteranotasi. Namun, untuk meminimalkan web.xmlpenggunaan, itu cukup untuk membubuhi keterangan semua filter hanya dengan filterNamesehingga Anda tidak memerlukan <filter>definisi, tetapi hanya <filter-mapping>definisi dalam urutan yang diinginkan.

Sebagai contoh,

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

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

dengan web.xmlhanya ini:

<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>

Jika Anda ingin mempertahankan pola URL @WebFilter, maka Anda dapat melakukannya,

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

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

tapi Anda masih harus menjaga <url-pattern>di web.xml, karena itu diperlukan sesuai XSD, meskipun bisa kosong:

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

Terlepas dari pendekatannya, ini semua akan gagal di Tomcat sampai versi 7.0.28 karena tersedak oleh kehadiran <filter-mapping>tanpa <filter>. Lihat juga Menggunakan Tomcat, @WebFilter tidak berfungsi dengan <filter-mapping> di dalam web.xml


5
mereka bisa memperkenalkan orderatribut @WebFilterMappinganotasi bersarang . Saya bertanya-tanya apakah mereka tidak melakukannya untuk kesederhanaan
Bozho

12
@ Bozho: Itu tidak akan cukup spesifik. Bagaimana jika webapp Anda dikirimkan dengan pustaka pihak ketiga yang menyertakan filter? Sulit untuk mengatakan pesanannya sebelumnya.
BalusC

1
@ BalusC: Ada yang salah dalam contoh Anda: pola-url ditutup dengan nama-filter.
AndrewBourgeois

3
@AndrewBourgeois: Tetap. Adalah kesalahan copypaste. Sayang sekali bahwa editor Markdown tidak memiliki validasi XML seperti dalam Eclipse;)
BalusC

6
Menggunakan <url-pattern />tidak berfungsi pada JBoss EAP 6.1 - ini mengesampingkan @WebFilternilai dan mencegah filter dari berjalan sama sekali.
seanf

12

Servlet 3.0 spec tampaknya tidak memberikan petunjuk tentang bagaimana suatu wadah harus memesan filter yang telah dinyatakan melalui anotasi. Jelas bagaimana cara memesan filter melalui deklarasi mereka di file web.xml.

Berhati-hatilah. Gunakan filter pesanan file web.xml yang memiliki saling ketergantungan. Cobalah untuk membuat semua filter Anda independen untuk meminimalkan kebutuhan untuk menggunakan file web.xml.


4
Saya memiliki banyak filter Servlet di proyek saya, dari mereka hanya filter tertentu yang harus disebut pertama dan urutan filter lain tidak menjadi perhatian. Apakah saya harus menajiskan semua filter di web.xml? Atau ada jalan pintas?
siva636
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.