Saya melihat ini di aplikasi Spring MVC saya web.xml
:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Saya mencoba mencari tahu mengapa itu ada dan apakah itu benar-benar dibutuhkan.
Saya menemukan penjelasan ini di dokumen Spring tetapi tidak membantu saya memahaminya:
Tampaknya menyarankan bahwa komponen ini adalah "perekat" antara servlet yang didefinisikan di web.xml
dan komponen yang ditentukan di Musim Semi applicationContext.xml
.
7.1 DelegatingFilterProxy
Saat menggunakan filter servlet, Anda jelas perlu mendeklarasikannya di Anda
web.xml
, atau mereka akan diabaikan oleh kontainer servlet. Dalam Keamanan Musim Semi, kelas filter juga merupakan kacang musim semi yang ditentukan dalam konteks aplikasi dan dengan demikian dapat memanfaatkan fasilitas injeksi ketergantungan Spring yang kaya dan antarmuka siklus hidup. SpringDelegatingFilterProxy
menyediakan hubungan antaraweb.xml
dan konteks aplikasi.Saat menggunakan DelegatingFilterProxy, Anda akan melihat sesuatu seperti ini di
web.xml
file:<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Perhatikan bahwa filter sebenarnya adalah a
DelegatingFilterProxy
, dan bukan kelas yang akan menerapkan logika filter. Apa yangDelegatingFilterProxy
dilakukan adalah mendelegasikan metode Filter melalui kacang yang diperoleh dari konteks aplikasi Spring. Hal ini memungkinkan kacang mendapatkan keuntungan dari dukungan siklus hidup konteks aplikasi web Spring dan fleksibilitas konfigurasi. Kacang harus diimplementasikanjavax.servlet.Filter
dan harus memiliki nama yang sama seperti yang ada di elemen nama filter. Baca Javadoc untuk DelegatingFilterProxy untuk informasi lebih lanjut
Jadi, jika saya mengeluarkan ini dari saya web.xml
, apa yang akan terjadi? Servletku tidak akan bisa berkomunikasi dengan wadah Spring? **
sumber
Tahukah Anda apa itu Filter Servlet dan cara kerjanya? Ini adalah bagian yang sangat berguna dari Servlet Spec, memungkinkan kita untuk menerapkan konsep mirip AOP untuk melayani permintaan HTTP. Banyak kerangka kerja menggunakan penerapan Filter untuk berbagai hal, dan tidak jarang menemukan penerapan khusus darinya karena sangat mudah ditulis dan berguna. Di aplikasi Spring, sebagian besar hal yang dapat dilakukan aplikasi Anda ada di Spring beans. Sebuah contoh Filter, meskipun, dikendalikan oleh wadah Servlet. Penampung membuat instance, menginisialisasi, dan menghancurkannya. Servlet Spec tidak memerlukan integrasi Spring apa pun, jadi Anda memiliki konsep yang sangat berguna (Filter) tanpa cara mudah untuk mengikatnya ke aplikasi Spring Anda dan kacang yang melakukan pekerjaan itu.
Masuk ke DelegatingFilterProxy. Anda menulis implementasi Filter dan menjadikannya Spring bean, tetapi alih-alih menambahkan kelas Filter Anda sendiri ke web.xml, Anda menggunakan DelegatingFilterProxy, dan memberinya nama bean filter Anda dalam konteks Spring. (Jika Anda tidak secara eksplisit memberikan nama, itu menggunakan "nama-filter".) Kemudian pada waktu proses, DelegatingFilterProxy menangani kerumitan dalam menemukan implementasi yang sebenarnya - yang Anda tulis dan konfigurasikan di Spring - dan mengarahkan permintaan ke sana . Jadi pada waktu proses, seolah-olah Anda telah mendaftarkan filter Anda di web.xml, tetapi Anda mendapatkan keuntungan karena dapat menyambungkannya seperti kacang Spring lainnya.
Jika Anda mengambil pemetaan filter itu dari web.xml Anda, semuanya akan terus berfungsi, tetapi tidak ada URL Anda yang akan diamankan. (Itu mengasumsikan nama "springSecurityFilterChain" secara akurat menjelaskan apa yang dilakukannya.) Itu karena pemetaan ini memfilter setiap permintaan yang masuk dan menyerahkannya ke filter keamanan yang ditentukan dalam konteks Spring Anda.
sumber
Apa itu Filter Servlet?
Filter servlet , secara umum, adalah konsep Java WebApp. Anda dapat memiliki filter servlet di aplikasi web apa pun, baik Anda menggunakan framework Spring atau tidak dalam aplikasi Anda.
Filter ini dapat mencegat permintaan sebelum mencapai servlet target. Anda dapat mengimplementasikan fungsionalitas umum, seperti otorisasi, dalam filter servlet. Setelah diterapkan, Anda dapat mengonfigurasi filter di web.xml Anda untuk diterapkan ke servlet tertentu, pola url permintaan khusus, atau semua pola url.
Dimana filter servlet digunakan?
Aplikasi web modern dapat memiliki lusinan filter seperti itu. Hal-hal seperti otorisasi, caching, manajemen sesi ORM, dan injeksi ketergantungan sering diimplementasikan dengan bantuan filter servlet. Semua filter ini harus terdaftar di
web.xml
.Instantiating Servlet Filters - tanpa Spring Framework
Kontainer servlet Anda membuat instance Filter yang dideklarasikan
web.xml
dan memanggilnya pada waktu yang tepat (mis., Saat melayani permintaan servlet). Sekarang jika Anda seperti sebagian besar penggemar Dependency Injection (DI), Anda mungkin akan mengatakan bahwa pembuatan instance adalah hal yang lebih baik dari framework DI saya (Spring). Tidak bisakah saya membuat filter servlet saya dibuat dengan Spring sehingga bisa menerima semua kebaikan DI?DelegatingFilterProxy
, sehingga Spring membuat instance filter AndaDi sinilah
DelegatingFilterProxy
langkah masukDelegatingFilterProxy
adalah impelmentasijavax.servlet.Filter
antarmuka yang disediakan oleh Spring Framework. Setelah Anda mengkonfigurasiDelegatingFilterProxy
di web.xml, Anda dapat mendeklarasikan kacang sebenarnya yang melakukan pemfilteran dalam konfigurasi pegas Anda. Dengan cara ini, Spring membuat instance kacang yang melakukan pemfilteran sebenarnya, dan Anda dapat menggunakan DI untuk mengkonfigurasi kacang ini.Perhatikan bahwa Anda hanya memerlukan satu
DelegatingFilterProxy
deklarasiweb.xml
tetapi Anda dapat memiliki beberapa pemfilteran yangbean
dirangkai bersama dalam konteks aplikasi Anda.sumber
Masalahnya, filter servlet dikelola oleh kontainer servlet, dan bukan oleh pegas. Dan Anda mungkin perlu menyuntikkan beberapa komponen pegas ke dalam filter Anda.
Jadi, jika Anda membutuhkan sesuatu seperti:
maka Anda memerlukan proxy filter yang mendelegasikan.
sumber
Anda benar tentang 'lem'. Seperti yang tertulis di JavaDocs dari FilterChainProxy :
Silakan lihat bagian FIlterChainProxy dari blog Di Balik Ruang Nama Keamanan Musim Semi untuk penjelasan yang sangat baik.
sumber
Saya bingung dengan "springSecurityFilterChain" di web.xml dan menemukan jawaban ini di dokumen keamanan springframework:
Ini tautannya http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html
sumber
Sudah lama sekali, tetapi saya memiliki pertanyaan yang sama dan saya menemukan ini: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html
Saya mencoba menjalankan proyek keamanan pegas saya dengan menghapus filter yang dimaksud dan juga menambahkannya. Apa yang saya temukan adalah jika kita menambahkan filter, maka panggilan akan dialihkan ke halaman login yang diperlukan seperti yang didefinisikan dalam konfigurasi spring-security.
Makanya, setuju dengan jawaban @ Ryan.
sumber