1. Pengantar filter
Filter juga disebut filter. Ini adalah teknologi paling menarik 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.
API Servlet menyediakan antarmuka filter. Saat mengembangkan aplikasi web, jika kelas Java tertulis mengimplementasikan antarmuka ini, kelas Java disebut filter filter. Melalui teknologi filter, pengembang dapat mengimplementasikan permintaan dan tanggapan akses pengguna sebelum mengakses sumber daya target, seperti yang ditunjukkan di bawah ini:
2. Bagaimana Intercept Filter?
Ada metode dofilter di antarmuka filter. Saat kami menulis filter dan mengkonfigurasi sumber daya web mana yang akan dicegat, server web akan memanggil metode filter dofilter 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).
3. Setelah memanggil sumber daya target, biarkan sepotong kode dieksekusi.
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.
3. Memulai pengembangan filter
3.1. Filter Langkah Pengembangan
Pengembangan filter dibagi menjadi dua langkah:
1. Tulis kelas Java untuk mengimplementasikan antarmuka filter dan mengimplementasikan metode dofilternya.
2. Gunakan elemen <nilter> dan <nilter-Mapping> dalam file web.xml untuk mendaftarkan kelas filter tertulis dan mengatur sumber daya yang dapat dicegat.
Contoh Filter:
Paket me.gacl.web.filter; import java.io.ioException; impor javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletexception; impor javax.servlet. javax.servlet.servletResponse;/*** @classname: filterDemo*@description: tiga aplikasi khas filter:*, Anda dapat memutuskan apakah akan memanggil rantai. Sumber Daya dijalankan, hasil eksekusi dari sumber daya target dapat ditangkap, dengan demikian mewujudkan beberapa fungsi khusus* @author: 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 � respons, rantai filterchain) melempar ioException, servletException {// silakan beberapa preprocessing atas permintaan dan respons request.setcharacterencoding ("utf-"); response.setcharacterencoding ("utf-"); response.setContentType ("Teks/html; charset = utf-"); System.out.println ("FilterDemo sebelum dieksekusi !!!"); rantai.dofilter (request, response); // Biarkan sumber daya target mengeksekusi dan melepaskan system.out.println ("filterDemo setelah eksekusi!!");}@Overridepublic void dashar () {System.out.println ("---- Filter Destruction ----");}} Konfigurasikan filter di web.xml:
<? Xml Version = "." encoding = "UTF-"?> <Web-App Version = "." xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w.org//xmlschema-instance" xsi: schemalocation = "http://java.sun http://java.sun.com/xml/ns/javaee/web-app__.xsd "> <play-name> </display-name> <creendak-file-list> <creendak-file> index.jsp </welcome-file> </celcome-file-list> <!-konfigurasi Filter-> <nilter> <nilter-name> filterDemo </tiler-name> <nilter-class> me.gacl.web.filter.filterdemo </filter-class> </tilter> <!-pemetaan filter-> <filter-mapping> <tilter-name> filterDemo </filter-name> <!-"/*" Permintaan-> <RURL-PATERS>/*</URL-PATERS> </TERFERTER-MAPPING> </web-app>
3.2. 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.
4. Siklus hidup filter
4.1. Pembuatan filter
Penciptaan dan penghancuran filter adalah tanggung jawab server web. Ketika aplikasi web dimulai, server web akan membuat objek instan filter dan memanggil metode init untuk menyelesaikan fungsi inisialisasi objek, sehingga mempersiapkan intersepsi untuk permintaan pengguna berikutnya. Objek filter hanya akan dibuat sekali, dan metode init hanya akan dieksekusi sekali. Melalui parameter metode init, objek filterconfig yang mewakili informasi konfigurasi filter saat ini dapat diperoleh.
4.2. Penghancuran filter
Web Container memanggil metode Destroy untuk menghancurkan filter. Metode Destroy dieksekusi hanya sekali selama siklus hidup filter. Dalam metode Destroy, sumber daya yang digunakan oleh filter dapat dibebaskan.
4.3. Antarmuka filterconfig
Saat mengkonfigurasi filter, pengguna dapat menggunakan <InT-Param> untuk mengonfigurasi beberapa parameter inisialisasi untuk filter. Ketika wadah web memancing objek filter dan memanggil metode init -nya, objek filterconfig yang merangkum parameter inisialisasi filter akan diteruskan. Oleh karena itu, ketika pengembang menulis filter, mereka dapat memperoleh:
String getFiltername (): Dapatkan nama filter.
String getInitparameter (nama string): Mengembalikan nilai parameter inisialisasi dengan nama yang ditentukan dalam deskripsi penyebaran. Kembalikan nol jika tidak ada.
Pencacahan getInitparameternames (): Mengembalikan serangkaian pencacaran nama semua parameter inisialisasi filter.
Public ServletContext getServletContext (): Mengembalikan referensi ke objek konteks servlet.
Contoh: Gunakan filterconfig untuk mendapatkan informasi konfigurasi filter
Paket me.gacl.web.filter; import java.io.ioexception; impor java.util.enumeration; impor javax.servlet.filter; javax.servlet.filterchain; import javax.servlet.filterconfig; impor javax.servlet.servlet javax.servlet.servletResponse; kelas publik FilterDemo mengimplementasikan filter {/* filter inisialisasi* @see javax.servlet.filter#init (javax.servlet.filterconfig)*/ @overridepublic void init (filter-lilterconfig) lempar servletexception {liftleTnoT. "-loughleTException. Initialization----");/*** <filter><filter-name>FilterDemo</filter-name><filter-class>me.gacl.web.filter.FilterDemo</filter-class><!--Configure initialization parameters of FilterDemo filter--><init-param><description>Configure initialization parameters of FilterDemo Filter </creckripe> <param-name> Nama </param-name> <param-value> gacl </param-value> </init-param> <Ilin-p aram> <creckripe> Konfigurasikan parameter inisialisasi dari FilterDemo filter</description><param-name>like</param-name><param-value>java</param-value></init-param></filter><filter-mapping><filter-name>FilterDemo</filter-name><!--"/*" means intercepting all requests--><url-pattern>/*</url-pattern></filter-mapping>*/// Get the filter's name String filterName = filterconfig.getFiltername (); // Dapatkan parameter inisialisasi yang dikonfigurasi dalam string file web.xml initparam = filterconfig.getInitparameter ("name"); String initparam = filterconfig.getInitparameter ("like"); // Mengembalikan satu set enumerasi dari semua parameter inisialisasi filter. Enumeration <string> initparameternames = filterconfig.getInitparameternames (); System.out.println (filtername); System.out.println (initparam); System.out.println (initparam); System.out.println (initparam); while (initparameternames.hasmoreElements ()) {string paramname = (string) initparameternames.nextElement (); system.out.println (paramName);}}@overridepublic void dofilter (servletexcepte, servletResponse response, filterchain rantai) rantai level rantai), filterChain rantai), filterchain rantai), filterchain rantai), filterChain rantai), filterChain rantai), filterChain rantai) rantai) rantai LAYANCHAINCEXCEPLECECECESCECECESCECECESCECESE, LAYAN SERVLETEXECPONSE) {System.out.println ("FilterDemo sebelum eksekusi !!!"); rantai.dofilter (permintaan, respons); // Biarkan sumber daya target dieksekusi dan system.out.println ("FilterDemo setelah eksekusi !!!");}@overridepublic void destroy () {System.out.println ("--- Penghancuran Filter ----");}} 5. Penempatan filter
Penyebaran filter dibagi menjadi dua langkah:
1. Daftar filter
2. Filter pemetaan
5.1. Daftar filter
Setelah mengembangkan filter, Anda perlu mendaftar di file web.xml sehingga Anda dapat dipanggil oleh server web.
Contoh Filter Daftar di file web.xml:
<filter><description>FilterDemo filter</description><filter-name>FilterDemo</filter-name><filter-class>me.gacl.web.filter.FilterDemo</filter-class><!--Configure initialization parameters of FilterDemo filter--><init-param><description>Configure initialization parameters of FilterDemo filter</desc ript> <param-name> Nama </param-name> <param-value> gacl </param-value> </init-param> <Ilin-param> <creckripe> Konfigurasikan parameter inisialisasi dari filterDemo filter </description> <param-name> seperti </param-name> <param-value> JAVA </PARAM-PARAM-PARAM-
<creckripe> digunakan untuk menambahkan informasi deskripsi. Konten elemen ini dapat kosong dan <precripsion> tidak dapat dikonfigurasi.
<filter-name> digunakan untuk menentukan nama untuk filter, dan konten elemen tidak dapat kosong.
Elemen <nilter-Class> digunakan untuk menentukan nama kelas yang memenuhi syarat dari filter.
Elemen <Ilin-Param> digunakan untuk menentukan parameter inisialisasi untuk filter, dan elemen anaknya <Param-name> menentukan nama parameter dan <param-value> menentukan nilai parameter. Pada filter, parameter inisialisasi dapat diakses menggunakan objek antarmuka filterconfig. Jika filter tidak perlu menentukan parameter inisialisasi, elemen <Ilin-Param> tidak dapat dikonfigurasi.
5.2. Filter pemetaan
Setelah mendaftarkan filter di file web.xml, Anda juga harus memetakan filter di file web.xml
<!-Mapping Filter-> <STERFERTER-MAPPING> <STERFER-NAME> FilterDemo </filter-name> <!-"/*" berarti mencegat semua permintaan-> <rerl-pola>/*</url-pattern> </filter-Mapping>
Elemen <nilter-Mapping> digunakan untuk mengatur sumber daya yang bertanggung jawab filter untuk mencegat. Filter yang mencegat sumber daya dapat ditentukan dalam dua cara: nama servlet dan jalur permintaan untuk akses sumber daya.
Elemen anak <STERFERTER-NAME> digunakan untuk mengatur nama pendaftaran filter. Nilai ini harus menjadi nama filter yang dinyatakan dalam elemen <rerl-pola>. Atur jalur permintaan dicegat oleh filter (gaya URL yang terkait dengan filter)
<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 mencegat berbagai cara memanggil sumber daya. sebagai berikut:
<nilter-Mapping> <STERFER-NAME> testFilter </tiler-name> <RURL-PATERS> /INDEX.JSP </RURL-PATERS> <Spatcher> Permintaan </Spatcher> <Spatcher> Forward </patcher> </filter-Mapping>
Nilai -nilai yang dapat ditetapkan oleh elemen anak dan artinya:
1.REQUEST: Ketika pengguna secara langsung mengakses halaman, wadah web akan menghubungi filter. Jika sumber daya target diakses melalui metode include () atau Forward () dari RequestDispatcher, filter tidak akan dipanggil.
2. Termasuk: Jika sumber daya target diakses melalui metode include () dari RequestDispatcher, filter akan dipanggil. Selain itu, filter tidak akan dipanggil.
3.Forward: Jika sumber daya target diakses melalui metode Forward () dari RequestDispatcher, filter akan dipanggil, dan filter tidak akan dipanggil sebagai tambahan.
4.Ror: Jika sumber daya target dipanggil melalui mekanisme penanganan pengecualian deklaratif, filter akan dipanggil. Selain itu, filter tidak akan dipanggil.