Gambaran Keseluruhan dan Keperluan untuk MendelegasikanFilterProxy pada Musim Bunga

1. Gambaran keseluruhan

The DelegatingFilterProxy adalah penapis servlet yang membolehkan lulus kawalan untuk Pilih kelas yang mempunyai akses kepada aplikasi konteks Spring. Spring Security sangat bergantung pada teknik ini.

Dalam tutorial ini, kita akan membahasnya secara terperinci.

2. MendelegasikanFilterProxy

Javadoc for DelegatingFilterProxy menyatakan bahawa ia adalah

Proksi untuk Servlet Filter standard, mendelegasikan ke kacang yang diuruskan Spring yang melaksanakan antara muka Filter.

Semasa menggunakan penapis servlet, jelas kita perlu menyatakannya sebagai kelas penapis di Java-config atau web.xml kita , jika tidak, wadah servlet akan mengabaikannya. Spring's DelegatingFilterProxy menyediakan hubungan antara web.xml dan konteks aplikasi.

2.1. Kerja Dalaman DelegatingFilterProxy

Mari lihat bagaimana pemindahan kawalan DelegatingFilterProxy ke kacang musim bunga kami.

Semasa inisialisasi, DelegatingFilterProxy mengambil nama penapis dan mengambil kacang dengan nama itu dari Spring Application Context. Kacang ini mestilah dari Jenis javax.Servlet.Filter, iaitu penapis servlet “normal”. Permintaan masuk kemudian akan dihantar ke kacang penapis ini.

Ringkasnya, kaedah doFilter () DelegatingFilterProxy akan menyerahkan semua panggilan ke Spring bean, yang membolehkan kita menggunakan semua ciri Spring dalam bean penapis kita.

Sekiranya kita menggunakan konfigurasi berbasis Java, pendaftaran saringan kami di ApplicationInitializer akan didefinisikan sebagai:

@Override protected javax.servlet.Filter[] getServletFilters() { DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy(); delegateFilterProxy.setTargetBeanName("applicationFilter");   return new Filter[]{delegateFilterProxy}; }

Sekiranya kita menggunakan XML, dalam fail web.xml :

 applicationFilter org.springframework.web.filter.DelegatingFilterProxy 

Ini bermaksud bahawa sebarang permintaan dapat dibuat untuk melewati saringan yang didefinisikan sebagai Spring bean dengan nama applicationFilter .

2.2. Keperluan untuk DelegatingFilterProxy

DelegatingFilterProxy adalah kelas dalam modul Web Spring. Ini menyediakan fitur untuk membuat panggilan HTTP melalui penapis sebelum sampai ke tujuan sebenarnya. Dengan bantuan DelegatingFilterProxy, kelas yang melaksanakan antara muka javax.Servlet.Filter dapat disambungkan ke rantai penapis.

Sebagai contoh, Spring Security menggunakan DelegatingFilterProxy sehingga dapat memanfaatkan ciri suntikan ketergantungan Spring dan antara muka kitaran hidup untuk penapis keselamatan.

DelegatingFilterProxy juga memanfaatkan pemfailan penapis khusus atau berbilang mengikut jalur Permintaan URI dengan memberikan konfigurasi dalam konteks aplikasi Spring atau di web.xml.

3. Membuat Penapis Tersuai

Seperti yang dijelaskan di atas, DelegatingFilterProxy adalah servlet filter itu sendiri yang mewakilkan kepada kacang yang diuruskan Spring tertentu yang menerapkan Interface Filter .

Dalam beberapa bahagian berikutnya, kami akan membuat penapis khusus dan mengkonfigurasinya menggunakan konfigurasi berasaskan Java & XML.

3.1. Kelas Penapis

Kami akan membuat penapis sederhana yang mencatat maklumat permintaan sebelum permintaan tersebut dilanjutkan.

Mari buat kelas penapis pertama:

@Component("loggingFilter") public class CustomFilter implements Filter { private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class); @Override public void init(FilterConfig config) throws ServletException {        // initialize something } @Override public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; LOGGER.info("Request Info : " + req); chain.doFilter(request, response); } @Override public void destroy() { // cleanup code, if necessary } } 

CustomFilter mengimplementasikan javax.Servlet.Filter . Kelas ini mempunyai anotasi @Component untuk mendaftar sebagai Spring bean dalam konteks aplikasi. Dengan cara ini, kelas DelegatingFilterProxy dapat mencari kelas penapis kami semasa memulakan rantai penapis.

Perhatikan bahawa nama kacang kacang mestilah sama dengan nilai dalam nama penapis yang diberikan semasa pendaftaran penapis tersuai di kelas ApplicationInitializer atau di web.xml kemudian kerana kelas DelegatingFilterProxy akan mencari kacang penapis dengan tepat nama yang sama dalam konteks aplikasi.

Sekiranya tidak dapat menemui kacang dengan nama ini, ia akan menimbulkan pengecualian semasa permulaan aplikasi.

3.2. Mengkonfigurasi Penapis melalui Konfigurasi Java

Untuk mendaftarkan penapis tersuai menggunakan konfigurasi Java, kita perlu mengganti kaedah getServletFilters () dari AbstractAnnotationConfigDispatcherServletInitializer :

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // some other methods here @Override protected javax.servlet.Filter[] getServletFilters() { DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy(); delegateFilterProxy.setTargetBeanName("loggingFilter");   return new Filter[]{delegateFilterProxy}; } }

3.3. Mengkonfigurasi Penapis melalui web.xml

Mari lihat bagaimana konfigurasi penapis di web.xml kelihatan seperti:

 loggingFilter org.springframework.web.filter.DelegatingFilterProxy   loggingFilter /* 

The penapis kelas hujah adalah jenis DelegatingFilterProxy dan tidak kelas penapis kita dicipta. Jika kita menjalankan kod ini dan memukul mana-mana URL, kemudian doFilter () kaedah yang CustomFilter akan dapat dilaksanakan dan memaparkan butiran maklumat permintaan dalam fail log.

4. Kesimpulan

Dalam artikel ini, kami telah membahas bagaimana DelegatingFilterProxy berfungsi dan cara menggunakannya.

Spring Security menggunakan DelegatingFilterProxy secara meluas untuk mendapatkan panggilan dan sumber API web dari akses yang tidak dibenarkan.

Kod sumber boleh didapati di GitHub.