Sebagai layanan gateway, Zuul adalah stasiun transit eksternal untuk layanan lain, dan permintaan diteruskan melalui Zuul. Ini melibatkan bahwa beberapa data tidak dapat dikembalikan utuh, seperti kredensial untuk komunikasi antara layanan, informasi enkripsi pengguna, dll.
Misalnya, layanan pengguna menyediakan antarmuka login. Setelah nama pengguna dan kata sandi benar, token dikembalikan. Token ini digunakan sebagai pass ke layanan pengguna. Kemudian token dikembalikan setelah pengguna masuk dengan sukses, itu perlu dienkripsi atau dicegah untuk merusak. Sebelum tiba di antarmuka lain dari layanan pengguna, token perlu diverifikasi. Token ilegal tidak perlu diteruskan ke layanan pengguna, dan informasi dapat dikembalikan langsung di lapisan gateway.
Untuk memodifikasi informasi yang dikembalikan oleh Layanan, Anda perlu menggunakan filter Zuul. Saat menggunakannya, Anda hanya perlu mewarisi Zuulfilter dan mengimplementasikan metode yang diperlukan.
Zuul menyediakan empat jenis filter default, yang diidentifikasi dengan metode filtertype.
Urutan di mana filter dieksekusi diurutkan dengan metode filterorder, dan semakin kecil nilainya, semakin disukai. Filterconstants menentukan urutan eksekusi dan routing dari beberapa kolom filter default, dan sebagian besar konstanta yang perlu digunakan ada di sini.
Seperti yang ditunjukkan pada contoh, hanya antarmuka login yang perlu dicegat, jadi hanya permintaan login (/pengguna/login) yang diperlukan. Anda dapat menggunakan metode filter yang seharusnya untuk menentukan apakah diperlukan intersepsi.
Karena modifikasi data dibuat setelah layanan pengguna berhasil, tipe pencegat adalah tipe post. Implementasi seluruh kelas adalah sebagai berikut:
AuthresponsEfilter kelas publik memperluas abstrakzuulfilter {private static final string response_key_token = "token"; @Value ("$ {System.config.authfilter.authurl}") Private String Authurl; @Value ("$ {System.config.AuthFilter.TokenKey}") Private String TokenKey = response_key_token; @Autowired Private Authapi Authapi; @Override public boolean seharusnya filter () {requestContext context = getCurrentContext (); return stringutils.equals (context.getRequest (). getRequesturi (). tostring (), auturl); } @Override Public Object Run () {coba {requestContext Context = getCurrentContext (); InputStream stream = context.getResponsedataStream (); String body = streamutils.copytostring (stream, charset.forname ("UTF-8")); if (stringutils.isnotblank (body)) {gson gson = new gson (); @SuppressWarnings ("Uncecked") MAP <String, String> RAFT = gson.fromjson (body, map.class); if (stringutils.isnotblank (result.get (tokenKey))) {authmodel authresult = authapi.encodetoken (result.get (tokenKey)); if (authResult.getStatus ()! = httpservletResponse.sc_ok) {lempar baru ilegalArgumentException (authResult.getErrmsg ()); } String accessToken = authresult.getToken (); result.put (tokenKey, accessToken); } body = gson.toJson (hasil); } context.setResponseBody (tubuh); } catch (ioException e) {rethrowruntimeException (e); } return null; } @Override public string filtertype () {return filterconstants.post_type; } @Override public int filterorder () {return filterconstants.send_response_filter_order - 2; }} Di file konfigurasi, tambahkan URL otorisasi dan kembalikan token kunci:
System.config.authfilter.authurl =/pengguna/login
System.config.authfilter.tokenkey = token
Context.SetResponseBody (Tubuh); Kode ini adalah inti, dan data yang dikembalikan dimodifikasi melalui metode ini.
Ketika pengguna masuk dengan sukses, enkripsi token dilakukan melalui layanan resmi berdasarkan token yang dikembalikan. Metode enkripsi di sini menggunakan JWT. Untuk mencegah pengguna merusak informasi, permintaan ilegal dapat langsung dicegat di lapisan gateway.
Mengenai proses eksekusi filter Zuul, tidak perlu menjelaskannya di sini. Anda dapat mengetahui sekilas kode sumbernya. Zuulservletfilter:
@Override public void dofilter (servletRequest servletRequest, servletResponse servletResponse, filterchain filterchain) melempar ioException, servletException {try {init ((httpservrequest) servletRequest, (httpservletResponse) ServletRequest); coba {prerouting (); } catch (ZuulException e) {error (e); postrouting (); kembali; } // Hanya meneruskan ke rantai jika respons Zuul tidak dikirim jika (! RequestContext.getCurrentContext (). SendzuulResponse ()) {filterchain.dofilter (servletRequest, servletResponse); kembali; } coba {routing (); } catch (ZuulException e) {error (e); postrouting (); kembali; } coba {postrouting (); } catch (ZuulException e) {error (New ZuulException (E, 500, "uncaught_exception_from_filter_" + e.getClass (). getName ())); } akhirnya {requestContext.getCurrentContext (). unset (); }}Deskripsi metode:
Penerusan yang diminta dapat diakhiri melalui konteks.
Tentang cara menghentikan filter:
Hanya filter pre-type yang mendukung penerusan penghentian, dan filter lain dieksekusi secara berurutan. Selain itu, filter pra-tipe hanya dapat menghentikan penerusan setelah semua filter pra-tipe dieksekusi. Filter tidak dapat diakhiri dan terus eksekusi. Lihatlah kode sumber ZuulservletFilter:
// Hanya meneruskan ke rantai jika respons Zuul tidak dikirim jika (! RequestContext.getCurrentContext (). SendzuulResponse ()) {filterchain.dofilter (servletRequest, servletResponse); kembali; } Kode dalam artikel ini telah dikirimkan ke: https://gitee.com/cmlbeliev/springcloud selamat datang ke bintang
Menerapkan kelas di: com.cml.springcloud.api.filter.authresponsefilter di bawah proyek API-getway
Alamat lokal: http://xz.vevb.com:81/201806/yuanma/cmmlbeliev-springcloud_jb51.rar
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.