Dalam contoh sebelumnya, kami menggunakan Zuul untuk membangun gateway //www.vevb.com/article/133235.htm
Saya tidak akan membahas detail tentang peran gateway di sini. Fokus kami hari ini adalah filter Zuul. Melalui filter, kami dapat menerapkan kontrol keamanan, misalnya, hanya klien dengan nama pengguna dan kata sandi dalam parameter permintaan yang dapat mengakses sumber daya server. Jadi bagaimana cara mengimplementasikan filter?
Untuk mengimplementasikan filter, langkah -langkah berikut diperlukan:
1. Mewarahkan kelas Zuulfilter. Untuk memverifikasi karakteristik filter, kami membuat 3 filter di sini.
Saring dengan nama pengguna
paket com.chhliu.springcloud.zuul; impor javax.servlet.http.httpservletRequest; impor com.netflix.zuul.zuulfilter; impor com.netflix.zuul.context.RequestContext; kelas publik AccessUserNamEfilter memperluas zuulfilter {@Override public run () {requestContext ctx = requestContext.getCurrentContext (); HttpservletRequest request = ctx.getRequest (); System.out.println (String.Format (" %S AccessUserNamefilter Permintaan ke %s", request.getMethod (), request.getRequesturl (). ToString ())); String username = request.getParameter ("nama pengguna"); // Dapatkan parameter yang diminta jika (null! = Nama pengguna && username.equals ("chhliu")) {// jika parameter yang diminta tidak kosong (true (true), ctx. ctx.set ("issuccess", true); // atur nilainya untuk membiarkan filter berikutnya melihat status filter sebelumnya pengembalian nol; } else {ctx.setsendzuulResponse (false); // filter permintaan dan jangan merutekannya ctx.setResponseStatusCode (401); // kembalikan kode kesalahan ctx.setResponseBody ("{/" hasil/":/" nama pengguna tidak benar!/" kembali nol; }} @Override public boolean seharusnya filter () {return true; // apakah akan menjalankan filter, memang benar di sini, menunjukkan bahwa penyaringan diperlukan} @Override public int filterorder () {return 0; // prioritas adalah 0, semakin besar angka, semakin rendah prioritas} @override public filtertype () {semakin besar angka "prioritas @override @override () {) {) {prioritas lebih prioritas" Dengan mewarisi Zuulfilter dan menimpa metode 4 di atas, Anda dapat mengimplementasikan filter sederhana. Berikut ini adalah deskripsi dari poin perhatian yang relevan.
FilterType: Mengembalikan string yang mewakili jenis filter. Empat jenis filter dengan siklus hidup yang berbeda didefinisikan dalam Zuul, sebagai berikut:
Siklus hidup permintaan utama Zuul mencakup tahapan seperti "Pre", "Route" dan "Post". Untuk setiap permintaan, semua filter dengan jenis ini dijalankan.
Filterorder: Menentukan urutan eksekusi filter melalui nilai int
harus memfilter: Mengembalikan tipe boolean untuk menentukan apakah filter akan dieksekusi, sehingga fungsi ini dapat mengimplementasikan sakelar filter. Dalam contoh di atas, kami secara langsung mengembalikan true, jadi filter selalu berlaku
Jalankan: Logika spesifik filter. Perlu dicatat bahwa di sini kita menggunakan ctx.setsendzuulResponse (false) untuk memfilter permintaan, dan tidak merutekannya, dan kemudian mengatur kode kesalahan yang dikembalikan melalui ctx.setresponseStatusCode (401).
Koordinasi antar filter
Tidak ada cara langsung bagi filter untuk mengakses satu sama lain. Mereka dapat menggunakan RequestContext untuk berbagi status, yang merupakan struktur seperti peta dengan beberapa metode aksesor eksplisit untuk primitif yang dianggap Zuul. Mereka diimplementasikan secara internal menggunakan threadlocal. Siswa yang tertarik dapat memeriksa kode sumber.
Buat filter dan filter lain sesuai dengan kata sandi:
paket com.chhliu.springcloud.zuul; impor javax.servlet.http.httpservletRequest; impor com.netflix.zuul.zuulfilter; impor com.netflix.zuul.context.RequestContext; kelas publik AccessPassWordFilter memperluas Zuulfilter {@Override Public Object Run () {RequestContext ctx = requestContext.getCurrentContext (); HttpservletRequest request = ctx.getRequest (); System.out.println (String.Format (" %S AccessPassWordFilter Permintaan ke %s", request.getMethod (), request.getRequesturl (). ToString ())); String username = request.getParameter ("kata sandi"); if (null! = username && username.equals ("123456")) {ctx.setsendzuulResponse (true); CTX.SetResponseStatusCode (200); ctx.set ("issuccess", true); kembali nol; } else {ctx.setsendzuulResponse (false); CTX.SetResponseStatusCode (401); ctx.setResponseBody ("{/" hasil/":/" kata sandi tidak benar!/"}"); ctx.set ("issuccess", false); kembali nol; }} @Override public boolean seharusnya filter () {requestContext ctx = requestContext.getCurrentContext (); return (boolean) ctx.get ("issuccess"); // Jika hasil filter sebelumnya benar, itu berarti bahwa filter sebelumnya telah berhasil dan perlu memasukkan filter saat ini. Jika hasil dari filter sebelumnya salah, itu berarti bahwa filter sebelumnya belum berhasil. Tidak perlu melakukan tindakan penyaringan berikut. Lewati semua filter berikutnya dan kembalikan hasilnya} @Override public int filterorder () {return 1; // prioritas diatur ke 1} @Override public string filtertype () {return "pre"; }} Buat filter pos di akhir
paket com.chhliu.springcloud.zuul; impor javax.servlet.http.httpservletRequest; impor com.netflix.zuul.zuulfilter; impor com.netflix.zuul.context.RequestContext; kelas publik AccessTokenFilter memperluas zuulfilter {@Override public run () {requestContext ctx = requestContext.getCurrentContext (); HttpservletRequest request = ctx.getRequest (); System.out.println (String.Format (" %S AccessTokenFilter Permintaan ke %s", request.getMethod (), request.getRequesturl (). ToString ())); ctx.setsendzuulResponse (true); CTX.SetResponseStatusCode (200); ctx.setResponseBody ("{/" name/":/" chhliu/"}"); // output hasil akhir return null; } @Override public boolean seharusnya filter () {return true; } @Override public int filterorder () {return 0; } @Override public string filtertype () {return "post"; // Setelah permintaan diproses, filter akan dimasukkan}} 2. Di kelas utama, giliran pertama pada dua filter pertama
@Bean Public AccessUserNamefilter AccessUserNamefilter () {return new AccessUserNamefilter (); } @Bean Public AccessPassWordFilter AccessPasswordFilter () {return New AccessPassWordFilter (); } 3. Masukkan permintaan dan verifikasi
(1) Permintaannya adalah: http: // localhost: 8768/h2service/user/1? Nama pengguna = chhliu
Hasil tes adalah: {"hasil": "Kata sandi tidak benar!"}
Hasil Pencetakan Konsol
Dapatkan permintaan AccessUserNamefilter ke http: // localhost: 8768/h2service/user/1
Dapatkan permintaan AccessPasswordFilter ke http: // localhost: 8768/h2service/user/1
Lulus filter AccessUserNamefilter, gagal saat memverifikasi filter AccessPassWordFilter
Tidak ada pencetakan SQL di latar belakang, yang berarti bahwa permintaan tidak dialihkan
(2) Permintaannya adalah: http: // localhost: 8768/h2service/pengguna/1? Kata sandi = 123456
Hasil tes adalah: {"hasil": "Nama pengguna tidak benar!"}
Hasil Pencetakan Konsol:
Dapatkan permintaan AccessUserNamefilter ke http: // localhost: 8768/h2service/user/1
Ini berarti bahwa filter AccessUserNamefilter telah tercapai, tetapi filter AccessPassWordFilter belum tercapai. Karena filter AccessUserNamefilter memiliki prioritas yang lebih tinggi, itu akan dieksekusi terlebih dahulu. Saat mengeksekusi, ditemukan bahwa kondisi filter tidak memenuhi, jadi semua filter setelah itu dilewati dan hasilnya dikembalikan tanpa pencetakan SQL di latar belakang, menunjukkan bahwa permintaan belum dialihkan.
(3) Permintaannya adalah: http: // localhost: 8768/h2service/pengguna/1? Kata sandi = 123456 & nama pengguna = chhliu
Hasil tes adalah:
{
"ID": 1,
"Nama pengguna": "user1",
"Nama": "Zhang San",
"Umur": 20,
"Balance": 100.00
}
Hasil pencetakan konsol:
Dapatkan permintaan AccessUserNamefilter ke http: // localhost: 8768/h2service/user/1
Dapatkan permintaan AccessPasswordFilter ke http: // localhost: 8768/h2service/user/1
Ini berarti bahwa AccessUserNamefilter dieksekusi terlebih dahulu dan kemudian AccessPasswordFilter dieksekusi. Ini konsisten dengan semakin kecil nilai pesanan yang kami sebutkan sebelumnya, semakin tinggi prioritasnya.
Layanan yang diminta pada saat yang sama memiliki output SQL:
Hibernate: Pilih user0_.id as ID1_0_0_, user0_.age as Age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_, user0_.username sebagai username5_0_0_ dari user0 USER0_ di mana user0_.id =?
Menunjukkan bahwa permintaan itu dialihkan.
4. Nyalakan filter pos dan jalankan lagi
Hasil tes: filter pos ditemukan terakhir dieksekusi, meskipun prioritasnya adalah 0
Mengenai siklus hidup filter Zuul, lihat gambar di bawah ini
Catatan: Ada kesalahan kecil pada gambar di atas, routing harus rute
5. Perluas
Zuul juga menyediakan jenis filter khusus, yaitu: StaticResponsefilter dan SurgicalDebugfilter
StaticResponsefilter: StaticResponsefilter memungkinkan generasi respons dari Zuul sendiri, daripada meneruskan permintaan ke sumber.
SurgicalDebugfilter: SurgicalDebugfilter memungkinkan routing permintaan spesifik ke cluster atau host debug yang dibatasi.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.