Pengantar Filter
Filter juga disebut filter. Ini adalah teknologi paling praktis dalam teknologi servlet. Melalui teknologi filter, pengembang web mencegat semua sumber daya web yang dikelola oleh server web: seperti JSP, servlet, file gambar statis atau file HTML statis, sehingga mencapai beberapa fungsi khusus. Misalnya, terapkan beberapa fungsi lanjutan seperti kontrol akses izin tingkat URL, penyaringan kosa kata sensitif, dan mengompresi informasi respons.
Ini terutama digunakan untuk memproses permintaan pengguna, dan juga dapat memposting HTTPServletResponse. Proses lengkap menggunakan filter: filter preprocesses permintaan pengguna, kemudian menyerahkan permintaan ke servlet untuk diproses dan menghasilkan respons, dan akhirnya memfilter proses pasca-proses respons server.
Fungsi filter
1. Mencegat httpservletRequest klien sebelum httpservletRequest tiba di servlet. Periksa httpservletRequest sesuai kebutuhan, dan Anda juga dapat memodifikasi header dan data httpservletRequest.
2. Intercept httpservletResponse sebelum mencapai klien. Periksa httpservletResponse sesuai kebutuhan, dan Anda juga dapat memodifikasi header dan data httpservletResponse.
Cara menggunakan filter untuk menerapkan fungsi intersepsi
Ada metode dofilter di antarmuka filter. Ketika pengembang menulis filter dan mengkonfigurasi sumber daya web mana yang akan dicegat, server web akan memanggil metode dofilter filter setiap kali sebelum memanggil metode layanan sumber daya web. Oleh karena itu, menulis kode dalam metode ini dapat mencapai tujuan berikut:
1. Biarkan sepotong kode dieksekusi sebelum memanggil sumber daya target.
2. Apakah akan memanggil sumber daya target (yaitu, apakah akan memungkinkan pengguna untuk mengakses sumber daya web).
Ketika server web memanggil metode dofilter, itu akan melewati objek filterChain. Ini juga menyediakan metode dofilter. Pengembang dapat memutuskan apakah akan memanggil metode ini sesuai dengan kebutuhan mereka. Jika metode ini dipanggil, server web akan memanggil metode layanan sumber daya web, yaitu, sumber daya web akan diakses, jika tidak sumber daya web tidak akan diakses.
Filter pengembangan dua langkah
Tulis kelas Java untuk mengimplementasikan antarmuka filter dan mengimplementasikan metode dofilternya.
Gunakan dan elemen dalam file web.xml untuk mendaftarkan kelas filter tertulis dan mengatur sumber daya yang dapat dicegat.
Pengantar Node Konfigurasi Web.xml:
Elemen <nilter-Mapping> digunakan untuk mengatur sumber daya yang filter bertanggung jawab untuk mencegat. Filter yang mencegat sumber daya dapat ditentukan dalam dua cara: nama servlet dan jalur permintaan untuk akses sumber daya.
<servlet-name> Menentukan nama servlet yang dicegat oleh filter.
<Spatcher> Menentukan cara sumber daya yang dicegat oleh filter dipanggil oleh wadah servlet. Ini bisa menjadi salah satu permintaan, termasuk, maju dan kesalahan, dan permintaan default. Pengguna dapat mengatur beberapa sub-elemen <Spatcher> untuk menentukan filter untuk mencegat berbagai cara panggilan sumber daya.
Nilai dan maknanya bahwa elemen anak dapat ditetapkan adalah sebagai berikut
Rantai filter
Dalam aplikasi web, beberapa filter dapat dikembangkan dan ditulis, yang digabungkan menjadi satu rantai filter.
Server web memutuskan filter mana yang akan dihubungi terlebih dahulu sesuai dengan urutan filter mana yang terdaftar di file web.xml. Ketika metode dofilter dari filter pertama dipanggil, server web akan membuat objek filterchain yang mewakili rantai filter dan meneruskannya ke metode. Dalam metode dofilter, jika pengembang memanggil metode dofilter dari objek filterchain, server web akan memeriksa apakah masih ada filter di objek filterchain. Jika ada, filter kedua dipanggil, dan jika tidak ada, sumber daya target dipanggil.
Siklus hidup filter
public void init (filterconfig filterconfig) melempar servletException; // inisialisasi
Seperti program Servlet yang kami tulis, pembuatan dan penghancuran filter adalah tanggung jawab server web. Ketika aplikasi web dimulai, server web akan membuat objek instan filter dan memanggil metode init untuk membaca konfigurasi web.xml untuk menyelesaikan fungsi inisialisasi objek, sehingga mempersiapkan intersepsi untuk permintaan pengguna berikutnya (objek filter hanya akan dibuat satu kali, dan metode init hanya akan dijalankan sekali). Pengembang dapat memperoleh objek filterconfig yang mewakili informasi konfigurasi filter saat ini melalui parameter metode init.
public void dofilter (permintaan servletRequest, respons servletResponse, rantai filterchain) melempar ioException, servletException; // permintaan intersep
Metode ini melengkapi operasi penyaringan yang sebenarnya. Ketika klien meminta akses ke URL yang terkait dengan filter, filter servlet pertama -tama akan menjalankan metode dofilter. Parameter filterchain digunakan untuk mengakses filter berikutnya.
public void hancurkan (); // hancurkan
Objek filter akan berada dalam memori setelah pembuatan dan akan dihancurkan ketika aplikasi web dihapus atau server dihentikan. Dipanggil sebelum wadah web menghapus instalasi objek filter. Metode ini dieksekusi hanya sekali selama siklus hidup filter. Dalam metode ini, sumber daya yang digunakan oleh filter dapat dibebaskan.
Antarmuka filterconfig
Saat mengkonfigurasi filter, pengguna dapat mengonfigurasi beberapa parameter inisialisasi untuk filter. Ketika wadah web instantiates objek filter dan memanggil metode init -nya, ia akan lulus dalam objek filterconfig yang merangkum parameter inisialisasi filter. Oleh karena itu, ketika pengembang menulis filter, mereka dapat memperoleh konten berikut melalui metode objek filterconfig:
String getFiltername (); // Dapatkan nama filter. String getInitparameter (nama string); // Mengembalikan nilai parameter inisialisasi dengan nama yang ditentukan dalam deskripsi penyebaran. Jika tidak ada keberadaan, kembalikan nol. Pencacahan getInitparameternames (); // Mengembalikan serangkaian nama enumerasi dari semua parameter inisialisasi filter. Public ServletContext getServletContext (); // Mengembalikan referensi ke objek konteks servlet.
Kasing Penggunaan Filter
Gunakan filter untuk memverifikasi kontrol keamanan login pengguna
Saya berpartisipasi dalam memelihara proyek beberapa waktu lalu. Setelah pengguna keluar dari sistem, ia pergi ke bilah alamat untuk mengakses sejarah. Menurut URL, ia masih bisa memasuki halaman respons sistem. Saya memeriksa dan menemukan bahwa permintaan tidak disaring dan diverifikasi bahwa login pengguna telah masuk. Tambahkan filter untuk menyelesaikan masalah!
Pertama kali mengonfigurasinya di web.xml
<filter> <nilter-name> sessionfilter </tilter-name> <nift-class> com.action.login.SessionFilter </filter-class> <InT-param> <param-name> Logonstring </param-name> <!-jangan memfilter halaman login-> <param-value> /project/index.jsps.jsps.loger> <Param-name> termasuk </param-name> <!-Saring hanya sufiks parameter filter yang ditentukan-> <param-value> .do; .jsp </param-value> </init-param> <Ilin-param> <param-name> </Param-name> <!-tidak via lompatan ke antarmuka loin-<param> </param-name> <! </init-param> <InT-param> <param-name> disabletestfilter </param-name> <!-y: filter tidak valid-> <param-value> n </param-value> <!-http://www.manongjc.com/article/1613.html-> </init-par> </articer/1613.html-> </init-par> <filter-name> sessionfilter </filter-name> <rerl-pattern>/*</uRl-pattern> </tiler-Mapping>
Kemudian tulis filerservlet.java:
Paket com.action.login; impor java.io.ioException; impor javax.servlet.filter; impor javax.servlet.filterchain; import javax.servlet.filterconfig; import Javax.servlet.servletException; impor javax.servlet.servletcressrle.servlet; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletResponse; Impor javax.servlet.http.httpservletResponsewrapper;/** Tentukan apakah pengguna login masuk, dan apakah itu tidak dicatat;/** http://www.manongjc.com/article/1613.html */kelas publik sessionfilter mengimplementasikan filter {public filterconfig config; public void hancurkan () {this.config = null; } public static boolean isContains (container string, string [] regx) {boolean hasil = false; untuk (int i = 0; i <regx.length; i ++) {if (container.indexof (regx [i])! = -1) {return true; }} hasil pengembalian; } public void dofilter (permintaan servletRequest, respons servletResponse, rantai filterchain) melempar ioException, servletException {httpservletrequest hrequest = (httpservletrequest) permintaan; HttpservletResponsewrapper wrapper = httpservletResponsewrapper ((httpservletResponse) baru); String logonstrings = config.getInitparameter ("logonstrings"); // Masuk ke string halaman login Inclayestrings = config.getInitparameter ("Inclayestrings"); // Filter Parameter Sufiks Sumber Daya String RedirectPath = hrequest.getContextPath () + config.getInitparameter ("redirectpath"); // Tidak ada login ke string page Turn DisabletestFilter = config.getInitparameter ("disabletestFilter"); // adalah filter valid if (disabletestfilter.touppercase (). Equals ("y")) {// rantai tidak valid (permintaan, respons); kembali; } String [] LogonList = LogAlsRings.Split (";"); String [] includeList = inclayestrings.split (";"); if (! this.iscontains (hRequest.getRequesturi (), includeList)) {// Hanya memfilter parameter filter yang ditentukan rantai.dofilter (permintaan, respons); kembali; } if (this.iscontains (hrequest.getRequesturi (), logoNlist)) {// Jangan memfilter rantai halaman login.dofilter (permintaan, respons); kembali; } String user = (string) hRequest.getSession (). GetAttribute ("userOnly"); // menilai apakah pengguna masuk if (user == null) {wrapper.sendredirect (redirectpath); kembali; } else {chain.dofilter (permintaan, respons); kembali; }} public void init (filterconfig filterconfig) melempar servletException {config = filterconfig; }}Dengan cara ini, semua permintaan kepada pengguna dapat diselesaikan, dan login pengguna harus diverifikasi melalui filter ini.
Mencegah filter yang kacau Cina
Ketika proyek menggunakan kerangka kerja Spring. Ketika set karakter yang berbeda digunakan dalam halaman JSP saat ini dan kode Java untuk pengkodean, akan ada masalah yang kacau dengan formulir data yang dikirimkan atau mengunggah/mengunduh file nama Cina. Maka Anda dapat menggunakan filter ini.
<filter> <filter-name> encoding </tilter-name> <nift-class> org.springframework.web.filter.characterencodingfilter </filter-class> <Ilin-param> <param-name> encoding </param-name> <!-digunakan untuk menentukan karakter spesifik yang ditetapkan-> <param-value> <fam-8 <Ilin-param> <param-name> ForceEncoding </param-name> <!-true: terlepas dari apakah permintaan telah menentukan set karakter, pengkodean digunakan; Salah: Jika permintaan telah menentukan set karakter, pengkodean tidak digunakan-> <param-value> false </param-value> </init-param> </tilter> <nilter-Mapping> <Tiler-name> Encoding </tiler-name> <rill-pattern>/*</ruRl-pola> </filter-mapping>
Spring+Hibernate's OpenSessionInviewFilter mengontrol saklar sesi
Ketika Hibernate+Spring digunakan bersamaan dengannya, jika malas = true diatur (pemuatan tertunda), kemudian ketika membaca data, hibernate akan secara otomatis menutup sesi setelah membaca data induk. Dengan cara ini, ketika Anda ingin menggunakan data yang terkait dan data anak, sistem akan melempar kesalahan LazyInit. Saat ini, Anda perlu menggunakan filter OpenSessionInviewFilter yang disediakan oleh Spring.
OpenSessionInviewFilter terutama mempertahankan status sesi sampai permintaan mengirimkan semua halaman ke klien, dan tidak menutup sesi sampai permintaan selesai, sehingga dapat menyelesaikan masalah yang disebabkan oleh pemuatan malas.
Catatan: Konfigurasi OpenSessionInviewFilter harus ditulis di depan konfigurasi Struts2. Karena wadah Tomcat dimuat secara berurutan saat memuat filter, jika file konfigurasi pertama -tama menulis konfigurasi filter dari struts2, dan kemudian konfigurasi filter OpenSessionInviewFilter, pesanan pemuatan menghasilkan sesi yang tidak dikelola oleh pegas saat mendapatkan data.
<filter> <!-Lazy Loading Diaktifkan di Spring-> <nilter-name> OpenSessionInviewFilter </tiler-name> <StuLT-Class> org.springframework.orm.hibernate3.support.openssionInviewFilter </filter-class> <init-param> <par param-name> sessionfactoryn. Secara default, kacang dengan ID sebagai sessionFactory dari wadah musim semi. Jika ID bukan sesiFactory, Anda perlu mengonfigurasinya sebagai berikut. Di sini, sessionfactory adalah kacang di wadah musim semi. --> <param-value>sessionFactory</param-value> </init-param> <init-param> <param-name>singleSession</param-name><!-- singleSession defaults to true, if set to false, it is equal to no use OpenSessionInView --> <param-value>true</param-value> </init-param></filter><filter-mapping> <filter-name> OpenSessionInviewFilter </filter-name> <RURL-PATERS>*. DO </RURL-PATERS> </TERFERTER-MAPPING>
Konfigurasi Web.xml Struts2
Untuk menggunakan Struts2 dalam proyek, Anda juga perlu mengkonfigurasi filter di web.xml untuk mencegat permintaan dan pergi ke tindakan Struts2 untuk diproses.
Catatan: Jika dalam versi Struts2 sebelum 2.1.3, filter menggunakan org.apache.struts2.dispatcher.filterdispatcher. Jika tidak, gunakan org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutEfilter. Dimulai dengan Struts 2.1.3, filter ActionContextCleanUp akan ditinggalkan, sedangkan fungsionalitas yang sesuai termasuk dalam strutsprepareand executeFilter filter.
Tiga parameter inisialisasi dikonfigurasi:
<!-Struts 2.x Filter-> <nilter> <nilter-name> struts2 </tiler-name> <nilter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecuteFilter </filter-class> </filter> <filter-Mapping> <filter-name> struts2 </filter-class> </filter> <filter-metping> <filter-name> struts2 </filter-class> </filter> <filter-metping> <filtername> struts2 </filter-no-n-nompape> n-name </filter> <RURL-PATERS>*. DO </RURL-PATERS> </TERFERTER-MAPPING>
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!