كخدمة بوابة ، Zuul هي محطة عبور خارجية للخدمات الأخرى ، ويتم إعادة توجيه الطلبات عبر Zuul. يتضمن ذلك أنه لا يمكن إرجاع بعض البيانات سليمة ، مثل بيانات الاعتماد للاتصال بين الخدمات ، ومعلومات تشفير المستخدم ، إلخ.
على سبيل المثال ، توفر خدمة المستخدم واجهة تسجيل الدخول. بعد صحة اسم المستخدم وكلمة المرور ، يتم إرجاع الرمز المميز. يتم استخدام هذا الرمز المميز كتمريرة إلى خدمة المستخدم. ثم يتم إرجاع الرمز المميز بعد تسجيل تسجيلات المستخدم بنجاح ، يجب تشفيره أو منعه من العبث. قبل الوصول إلى واجهات أخرى لخدمة المستخدم ، يجب التحقق من الرمز المميز. لا تحتاج الرموز غير القانونية إلى إعادة توجيهها إلى خدمة المستخدم ، ويمكن إرجاع المعلومات مباشرة عند طبقة البوابة.
لتعديل المعلومات التي يتم إرجاعها بواسطة الخدمة ، تحتاج إلى استخدام مرشح Zuul. عند استخدامه ، تحتاج فقط إلى ورث Zuulfilter وتنفيذ الأساليب اللازمة.
يوفر Zuul أنواع المرشحات الأربعة الافتراضية ، والتي يتم تحديدها بواسطة طريقة FilterType.
يتم فرز الترتيب الذي يتم فيه تنفيذ المرشحات بواسطة طريقة Filterorder ، وكلما كانت القيمة أصغر ، كلما كانت مفضلة. يحدد FilterConstants ترتيب التنفيذ ونوع التوجيه لبعض أعمدة المرشحات الافتراضية ، ومعظم الثوابت التي تحتاج إلى استخدام هنا.
كما هو موضح في المثال ، يجب اعتراض واجهة تسجيل الدخول فقط ، لذلك هناك حاجة فقط إلى طلب تسجيل الدخول (/المستخدم/تسجيل الدخول). يمكنك استخدام طريقة يجب أن يكون للمرشح لتحديد ما إذا كان الاعتراض مطلوبًا.
نظرًا لأن تعديل البيانات بعد نجاح خدمة المستخدم ، فإن نوع العرض هو نوع النشر. تنفيذ الفصل بأكمله هو كما يلي:
الطبقة العامة AuthResponseFilter يمتد AbstractZuulfilter {private Static Final String Response_key_token = "Token" ؛ Value ("$ {system.config.authfilter.authurl}") private string authurl ؛ value ("$ {system.config.authfilter.tokenkey}") tokenkey private string = desponse_key_token ؛ AUTOWIRED Private Authapi Authapi ؛ Override public boolean shouldfilter () {requestContext context = getCurrentContext () ؛ return stringUtils.equals (context.getRequest (). getRequesturi (). } Override Public Object Run () {try {requestContext context = getCurrentContext () ؛ inputStream Stream = context.getResponSedAtArtream () ؛ body string = StreamUtils.copyToString (Stream ، charset.forname ("utf-8")) ؛ if (stringUtils.isnotBlank (body)) {gson gson = new gson () ؛ suppressWarnings ("غير محدد") خريطة <string ، string> result = gson.fromjson (body ، map.class) ؛ if (stringUtils.isNotBlank (result.get (tokenkey))) if (authresult.getStatus ()! = httpservletresponse.sc_ok) {رمي new alfictalargumentException (authResult.geterRmsg ()) ؛ } String AccessToken = AuthResult.getToken () ؛ النتيجة. } body = gson.tojson (result) ؛ } context.setResponseBody (body) ؛ } catch (ioException e) {rethrowruntimeException (e) ؛ } إرجاع فارغ ؛ } Override public string filterType () {return filterConstants.post_type ؛ } Override public int filterorder () {return filterConstants.send_response_filter_order - 2 ؛ }} في ملف التكوين ، أضف عنوان URL لإذن وإرجاع رمز المفتاح:
System.Config.authfilter.authurl =/user/login
system.config.authfilter.tokenkey = رمز
context.setResponseBody (الجسم) ؛ هذا الرمز أساسي ، ويتم تعديل البيانات التي تم إرجاعها من خلال هذه الطريقة.
عندما يقوم المستخدم بتسجيل الدخول بنجاح ، يتم تنفيذ تشفير الرمز المميز من خلال الخدمات المعتمدة بناءً على الرمز المميز الذي تم إرجاعه. تستخدم طريقة التشفير هنا JWT. لمنع المستخدمين من العبث بالمعلومات ، يمكن اعتراض الطلبات غير القانونية مباشرة على طبقة البوابة.
فيما يتعلق بعملية تنفيذ مرشح Zuul ، ليست هناك حاجة لشرحها هنا. يمكنك أن تقول في لمحة عن رمز المصدر. ZuulservletFilter:
Override public void dofilter (servletrequest servletrequest ، servletResponse servletResponse ، filterchain filterchain) يرمي ioException ، servletexception {try {init ((httpservletrequest) servletrequest ، (httpservletresponse) servletResponse) ؛ حاول {prerouting () ؛ } catch (zuulexception e) {error (e) ؛ postrouting () ؛ يعود؛ } // فقط للأمام إلى السلسلة إذا لم يتم إرسال استجابة Zuul إذا (! requestContext.getCurrentContext (). sendzuulresponse ()) {filterchain.dofilter (servletrequest ، servletResponse) ؛ يعود؛ } جرب {Routing () ؛ } catch (zuulexception e) {error (e) ؛ postrouting () ؛ يعود؛ } حاول {postrouting () ؛ } catch (zuulexception e) {error (new zuulexception (e ، 500 ، "uncaught_exception_from_filter_" + e.getClass (). getName ())) ؛ } أخيرًا {requestContext.getCurrentContext (). unset () ؛ }}وصف الطريقة:
يمكن إنهاء إعادة التوجيه المطلوبة من خلال السياق.
حول كيفية إنهاء المرشح:
يتم تنفيذ مرشحات ما قبل النوع الدعم فقط لإعادة توجيه الإنهاء ، ويتم تنفيذ المرشحات الأخرى بالتسلسل. علاوة على ذلك ، لا يمكن لمرشحات ما قبل النوع إنهاء إعادة التوجيه إلا بعد تنفيذ جميع مرشحات ما قبل النوع. لا يمكن إنهاء المرشح واستمرار التنفيذ. انظر إلى رمز مصدر ZuulservletFilter:
// فقط للأمام إلى السلسلة إذا لم يتم إرسال استجابة Zuul إذا (! requestContext.getCurrentContext (). sendzuulresponse ()) {filterchain.dofilter (servletrequest ، servletResponse) ؛ يعود؛ } تم إرسال الرمز في هذه المقالة إلى: https://gitee.com/cmlbeliev/springcloud مرحبًا بك في Star
تنفيذ الفصل في: com.cml.springcloud.api.filter.authresponsefilter ضمن مشروع API-Getway
العنوان المحلي: http://xz.vevb.com:81/201806/yuanma/cmmlbeliev-springcloud_jb51.rar
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.