Saya ingin tahu, apakah ada penjelasan untuk Filter
kelas (untuk aplikasi web) di Spring Boot? Mungkin @Filter
?
Saya ingin menambahkan filter khusus di proyek saya.
Panduan Referensi Boot Spring menyebutkan tentang
FilterRegistrationBean
, tetapi saya tidak yakin bagaimana menggunakannya.
java
configuration
spring-boot
servlet-filters
petugas kebersihan
sumber
sumber
Jawaban:
Jika Anda ingin menyiapkan filter pihak ketiga yang dapat Anda gunakan
FilterRegistrationBean
. Misalnya setara dengan web.xmlIni akan menjadi dua kacang di
@Configuration
file AndaDi atas diuji dengan spring-boot 1.2.3
sumber
someFilter()
secara langsung.Berikut ini adalah contoh dari salah satu metode termasuk filter khusus dalam aplikasi Spring Boot MVC. Pastikan untuk memasukkan paket dalam pemindaian komponen:
sumber
MetricsFilter
, tetapi kacang ini akan dibayangi oleh kacang aktuator Spring dengan nama yang sama. Belajar ini dengan cara yang sulit ...Tidak ada penjelasan khusus untuk menunjukkan filter servlet. Anda cukup mendeklarasikan
@Bean
tipeFilter
(atauFilterRegistrationBean
). Contoh (menambahkan tajuk khusus ke semua respons) ada dalam Boot's EndpointWebMvcAutoConfiguration ;Jika Anda hanya menyatakan
Filter
itu akan diterapkan untuk semua permintaan. Jika Anda juga menambahkan, Anda jugaFilterRegistrationBean
dapat menentukan masing-masing servlet dan pola url untuk diterapkan.catatan:
Pada Spring Boot 1.4,
FilterRegistrationBean
tidak usang dan hanya memindahkan paket dariorg.springframework.boot.context.embedded.FilterRegistrationBean
keorg.springframework.boot.web.servlet.FilterRegistrationBean
sumber
Filter
di kelas Anda. Biasanya saya hanya akan menggunakanspring-boot-starter-web
untuk menarik semua dependensi yang relevan (misalnya di sini ).Ada tiga cara untuk menambahkan filter Anda,
@Component
@Bean
denganFilter
tipe di Musim Semi@Configuration
@Bean
denganFilterRegistrationBean
tipe di Musim Semi@Configuration
# 1 atau # 2 akan dilakukan jika Anda ingin filter Anda berlaku untuk semua permintaan tanpa penyesuaian, gunakan # 3 sebaliknya. Anda tidak perlu menentukan pemindaian komponen untuk # 1 agar berfungsi selama Anda menempatkan kelas filter Anda di sub-paket yang sama atau
SpringApplication
kelas Anda . Untuk # 3, gunakan bersama dengan # 2 hanya diperlukan ketika Anda ingin Spring mengelola kelas filter Anda seperti memilikinya dependensi kabel otomatis. Ini berfungsi dengan baik bagi saya untuk baru filter saya yang tidak memerlukan autowiring / injeksi ketergantungan.Meskipun menggabungkan # 2 dan # 3 berfungsi dengan baik, saya terkejut itu tidak berakhir dengan dua filter yang diterapkan dua kali. Dugaan saya adalah bahwa Spring menggabungkan dua kacang sebagai satu ketika memanggil metode yang sama untuk membuat keduanya. Jika Anda ingin menggunakan # 3 sendirian dengan authowiring, Anda bisa
AutowireCapableBeanFactory
. Berikut ini adalah contoh,sumber
Filter
saat Anda menggunakanFilterRegistrationBean
PEMBARUAN: 2017-12-16:
Ada 2 cara sederhana untuk melakukan ini di Spring Boot 1.5.8.RELEASE, tidak perlu untuk XML.
Cara pertama: Jika Anda tidak memiliki pola URL spacific, Anda dapat menggunakan @Component seperti ini: (Kode lengkap dan detailnya di sini https://www.surasint.com/spring-boot-filter/ )
Cara kedua: Jika Anda ingin menggunakan pola url, Anda dapat menggunakan @WebFilter seperti ini: (Kode lengkap dan detailnya di sini https://www.surasint.com/spring-boot-filter-urlpattern/ )
Tetapi Anda juga perlu menambahkan anotasi @ServletComponentScan di kelas @SpringBootApplication Anda:
Perhatikan bahwa @Component adalah anotasi Spring, tetapi @WebFilter tidak. @WebFilter adalah anotasi Servlet 3.
Kedua cara, Anda hanya perlu ketergantungan Boot Musim Semi dasar di pom.xml (tidak perlu untuk jasper tertanam tomcat eksplisit)
PERINGATAN: Cara pertama, jika Controller di Spring Boot kembali ke file JSP, permintaan akan melewati filter dua kali.
Sementara, dengan cara kedua, permintaan akan melewati filter hanya sekali.
Saya lebih suka cara kedua karena lebih mirip dengan perilaku default dalam spesifikasi Servlet ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )
Anda dapat melihat lebih banyak log uji di sini https://www.surasint.com/spring-boot-webfilter-instead-of-component/
sumber
Filter
antarmuka dipanggil berkali-kali selama peluncuran applicationContext. Apakah ada cara untuk menjalankannya hanya sekali?Berikut adalah contoh kelas Filter kustom saya:
Dan saya menambahkannya ke konfigurasi boot Spring dengan menambahkannya ke kelas Konfigurasi sebagai berikut:
sumber
Dari Spring docs,
Wadah servlet tertanam - Tambahkan Servlet, Saring atau Listener ke aplikasi
Misalnya:
Tambahkan
@Bean
konfigurasi ini ke@Configuration
kelas Anda dan filter akan terdaftar pada saat startup.Anda juga dapat menambahkan Servlets, Filter, dan Pendengar menggunakan pemindaian classpath,
sumber
Jika Anda menggunakan Spring Boot + Spring Security, Anda dapat melakukannya di konfigurasi keamanan.
Dalam contoh di bawah ini, saya menambahkan filter khusus sebelum UsernamePasswordAuthenticationFilter (lihat semua filter Spring Security default dan urutannya ).
Dan kelas filter
sumber
Menggunakan anotasi @WebFilter, dapat dilakukan sebagai berikut:
sumber
Kami memiliki sekitar empat opsi berbeda untuk mendaftarkan filter menggunakan Spring .
Pertama, kita bisa membuat Filter implementasi kacang Spring atau memperluas HttpFilter :
Kedua, kita bisa membuat kacang Spring yang memperpanjang GenericFilterBean :
Atau kita bisa menggunakan kelas FilterRegistrationBean :
Dan terakhir kita dapat menggunakan @WebFilter penjelasan dengan @ServletComponentScan :
sumber
Ini lebih merupakan saran daripada jawaban, tetapi jika Anda menggunakan Spring MVC dalam aplikasi web Anda, ide baiknya adalah menggunakan Spring HandlerInterceptor alih-alih Filter
Ini dapat melakukan pekerjaan yang sama, tetapi juga - Dapat bekerja dengan ModelAndView - Metodenya dapat dipanggil sebelum dan sesudah pemrosesan permintaan, atau setelah permintaan selesai.
- Dapat dengan mudah diuji
1 Terapkan antarmuka HandlerInterceptor dan tambahkan anotasi @Component ke kelas Anda
2 Konfigurasikan Interceptor Anda
sumber
Filter ini juga akan membantu Anda mengizinkan akses lintas asal
sumber
Anda bisa menggunakan @WebFilter javax.servlet.annotation.WebFilter pada kelas yang mengimplementasikan javax.servlet.Filter
Kemudian gunakan @ServletComponentScan untuk mendaftar
sumber
Saya melihat banyak jawaban di sini tetapi saya tidak mencoba salah satu dari mereka. Saya baru saja membuat filter seperti pada kode berikut.
Dan meninggalkan aplikasi Spring Boot yang tersisa seperti itu.
sumber
Anda memerlukan 2 hal utama: - Tambahkan
@ServletComponentScan
ke Kelas Utama Anda - Anda dapat menambahkan paket bernama filter di dalamnya Anda membuatFilter
Kelas yang memiliki yang berikut:sumber
Anda juga dapat membuat filter dengan menggunakan @WebFilter dan mengimplementasikan Filter, itu akan dilakukan.
sumber
Filter seperti namanya disarankan untuk melakukan pemfilteran baik pada permintaan ke sumber daya atau pada respons dari sumber daya, atau keduanya. Spring Boot menyediakan beberapa opsi untuk mendaftarkan filter khusus dalam aplikasi Spring Boot. Mari kita lihat opsi yang berbeda.
1. Tentukan Spring Boot Filter dan Invocation Order
Terapkan antarmuka Filter untuk membuat filter baru di Spring Boot.
Mari kita cepat melihat beberapa poin penting dalam kode di atas
Untuk mengaktifkan filter dengan urutan yang benar – kami harus menggunakan anotasi @Order .
Dalam kode di atas, CustomFirstFilter akan berjalan sebelum CustomSecondFilter.
2. Pola URL
Jika pemetaan berbasis konvensi tidak cukup fleksibel, kita dapat menggunakan FilterRegistrationBean untuk kontrol penuh aplikasi. Di sini, jangan gunakan @Component annotation untuk kelas filter tetapi daftarkan filter menggunakan FilterRegistrationBean .
Daftarkan Filter khusus menggunakan FilterRegistrationBean .
sumber
Anda perlu menerapkan Filter dan perlu dijelaskan dengan @WebFilter (urlPatterns = "/ *")
Dan di kelas Aplikasi atau Konfigurasi Anda perlu menambahkan @ServletComponentScan. Dengan ini, filter Anda akan didaftarkan.
sumber
@WebFilter
hanya sejak Servlet 3.0. Jadi mungkin tidak berfungsi dengan baik untuk 2,5Langkah 1: Buat komponen filter dengan menerapkan antarmuka Filter.
Langkah 2: Atur filter ini ke pola uri menggunakan FilterRegistrationBean.
Anda dapat merujuk tautan ini untuk aplikasi lengkap.
sumber
Pertama, tambahkan
@ServletComponentScan
ke kelas SpringBootApplication Anda.Kedua, buat file filter yang memperpanjang Filter atau kelas filter pihak ketiga dan tambahkan
@WebFilter
ke file ini seperti ini:sumber
Saya melihat jawaban oleh @Vasily Komarov. Pendekatan yang serupa, tetapi menggunakan kelas HandlerInterceptorAdapter abstrak daripada menggunakan HandlerInterceptor .
Berikut ini sebuah contoh ...
sumber
Seperti yang Anda ketahui, Spring Boot adalah cara luar biasa untuk mengembangkan WebApp atau StandaloneApp dengan konfigurasi minimum dan Pengaturan yang disarankan.
Ini adalah bagaimana saya telah mencapai Pengembangan Web Filter di aplikasi Spring Boot
Versi Spring Boot: 2.0.4.RELEASE
Versi Java: 8.0
Spesifikasi Servlet: Servlet 3.0 (Wajib dan Penting)
Saya mendeklarasikan Filter Web saya dengan cara berikut, mengikuti Servlet Spesifikasi 3.0
Ini adalah cara terprogram untuk mendefinisikan Filter sebagai pengganti definisi berbasis web.xml.
"@Webfilter" anotasi akan diproses oleh wadah selama penyebaran, kelas Filter tempat ditemukan akan dibuat sesuai konfigurasi dan diterapkan ke pola URL, javax.servlet.Servlets dan javax.servlet.DispatcherTypes.
Untuk menggunakan Aplikasi Boot Spring sebagai "PERANG Tradisional", kelas aplikasi harus memperluas SpringBootServletInitializer.
CATATAN :: SpringBootServletInitializer adalah "Implementasi Programmatic" dari web.xml dengan mengacu pada spesifikasi Servlet 3.0+, yang memerlukan implementasi WebApplicationInitializer.
Dengan demikian, SpringBootApplication tidak memerlukan "web.xml" sebagai kelas Aplikasi (setelah memperpanjang SpringBootServletInitializer) memindai
- @WebFilter,
- @WebListener dan
- @WebServlet.
Anotasi ini memungkinkan pemindaian paket dasar untuk komponen web yang dianotasi dengan @WebFilter, @WebListener dan @WebServlet.
Karena kenyataan bahwa wadah yang disematkan tidak mendukung anotasi @WebServlet, @WebFilter dan @WebListener, Spring Boot, sangat bergantung pada wadah yang disematkan, memperkenalkan anotasi baru ini @ServletComponentScan untuk mendukung beberapa toples dependen yang menggunakan 3 anotasi ini.
Pemindaian hanya dilakukan saat menggunakan wadah Servlet tertanam.
Di sini: Saya telah mendefinisikan Kelas Kustom: "ServletInitializer" yang memperluas Kelas: SpringBootServletInitializer.
Seperti yang dijelaskan sebelumnya, SpringBootServletInitializer bertanggung jawab untuk memindai anotasi: -
- @WebFilter,
- @WebListener dan
- @WebServlet.
Dan karenanya Kelas Aplikasi Boot Musim Semi seharusnya
sumber
Filter sebagian besar digunakan dalam file logger bervariasi sesuai dengan logger yang Anda gunakan dalam proyek biar jelaskan untuk log4j2:
Filter digunakan untuk membatasi data dan saya menggunakan filter ambang batas lebih lanjut untuk membatasi level data dalam aliran yang saya sebutkan level yang dapat dibatasi di sana. Untuk referensi Anda lebih lanjut lihat urutan tingkat log4j2 - Tingkat Log4J: ALL> TRACE> DEBUG> INFO> PERINGATAN> KESALAHAN> FATAL> MATI
sumber
FilterRegistrationBean
seperti yang disebutkan dalam pertanyaan adalah untukjavax.servlet.Filter
, jawaban ini berbicara tentangorg.apache.logging.log4j.core.Filter