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?

siva636
sumber

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

BalusC
sumber
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.

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