في المثال السابق ، استخدمنا Zuul لإنشاء بوابة //www.vevb.com/article/133235.htm
لن أخوض في تفاصيل دور البوابات هنا. تركيزنا اليوم هو مرشح Zuul. من خلال Filter ، يمكننا تنفيذ التحكم في الأمان ، على سبيل المثال ، فقط العملاء الذين يحملون اسم المستخدم وكلمة المرور في المعلمات التي يمكنها الوصول إلى موارد الخادم. إذن كيف تنفذ المرشح؟
لتنفيذ المرشح ، الخطوات التالية مطلوبة:
1. ورث فئة Zuulfilter. من أجل التحقق من خصائص المرشح ، نقوم بإنشاء 3 مرشحات هنا.
تصفية اسم المستخدم
حزمة com.chhliu.springcloud.zuul ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد com.netflix.zuul.zuulfilter ؛ استيراد com.netflix.zuul.context.requestContext ؛ الفئة العامة AccessUserNameFilter يمتد Zuulfilter {Override Public Object Run () {requestContext ctx = requestContext.getCurrentContext () ؛ httpservletrequest request = ctx.getRequest () ؛ system.out.println (string.format ("٪ s accessUserNameFilter request to ٪ s" ، request.getMethod () ، request.getRequesturl (). toString ())) ؛ username username = request.getParameter ("اسم المستخدم") ؛ // احصل على المعلمة المطلوبة إذا (null! = username && username.equals ("chhliu")) {// إذا لم تكن المعلمة المطلوبة فارغة وقيمة chhliu ، ثم استخدم ctx.setsendzuulseponse (true) ؛ ctx.set ("issuccess" ، true) ؛ // قم بتعيين القيمة للسماح للمرشح التالي بمشاهدة حالة المرشح السابق الفارغ ؛ } آخر {ctx.setsendzuulresponse (false) ؛ // تصفية الطلب ولا تتبعه ctx.setResponsestatusCode (401) ؛ // إرجاع رمز الخطأ ctx.setResponsebody ("{/" result/":/" username غير صحيح!/"}") العودة لاغية. }}} Override public boolean shouldfilter () {return true ؛ // ما إذا كان يجب تنفيذ المرشح ، فهذا صحيح هنا ، مما يشير إلى أن التصفية مطلوب} @ @public filterorder () {return 0 ؛ من خلال وراثة Zuulfilter والكتابة فوق الطرق الأربعة المذكورة أعلاه ، يمكنك تنفيذ مرشح بسيط. فيما يلي وصف لنقاط الاهتمام ذات الصلة.
FilterType: إرجاع سلسلة تمثل نوع المرشح. يتم تعريف أربعة أنواع مرشحات ذات دورات حياة مختلفة في Zuul ، على النحو التالي:
تتضمن دورة حياة Zuul الرئيسية مراحل مثل "Pre" و "Route" و "Post". لكل طلب ، يتم تشغيل جميع المرشحات التي تحتوي على هذه الأنواع.
Filterorder: يحدد ترتيب تنفيذ المرشحات من خلال قيمة int
يجب أن يكون ذلك: إرجاع نوع منطقي لتحديد ما إذا كان سيتم تنفيذ المرشح ، بحيث يمكن لهذه الوظيفة تنفيذ مفتاح المرشح. في المثال أعلاه ، نعود بشكل صحيح مباشرة ، وبالتالي فإن المرشح يسري دائمًا
تشغيل: المنطق المحدد للمرشح. تجدر الإشارة إلى أننا هنا نستخدم ctx.setsendzuulresponse (خطأ) لتصفية الطلب ، وعدم توجيهه ، ثم ضبط رمز الخطأ الذي يعيده من خلال ctx.setResponsestatuscode (401).
التنسيق بين المرشحات
لا توجد طريقة مباشرة للمرشحات للوصول إلى بعضها البعض. يمكنهم استخدام requestContext لمشاركة الحالة ، وهو عبارة عن بنية تشبه الخريطة مع بعض أساليب الملحقات الواضحة للأوامر البدائية التي تعتبر Zuul. يتم تنفيذها داخليًا باستخدام ThreadLocal. يمكن للطلاب المهتمين التحقق من رمز المصدر.
قم بإنشاء مرشح آخر وتصفية وفقًا لكلمة المرور:
حزمة com.chhliu.springcloud.zuul ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد com.netflix.zuul.zuulfilter ؛ استيراد com.netflix.zuul.context.requestContext ؛ الفئة العامة AccessPasswordFilter يمتد Zuulfilter {Override Public Object Run () {requestContext ctx = requestContext.getCurrentContext () ؛ httpservletrequest request = ctx.getRequest () ؛ system.out.println (string.format ("٪ s accessPasswordFilter request to ٪ s" ، request.getMethod () ، request.getRequesturl (). toString ())) ؛ سلسلة username = request.getParameter ("كلمة المرور") ؛ if (null! = username && username.equals ("123456")) {ctx.setsendzuulresponse (true) ؛ CTX.SetResponsestatusCode (200) ؛ ctx.set ("issuccess" ، true) ؛ العودة لاغية. } آخر {ctx.setsendzuulresponse (false) ؛ CTX.SetResponsestatusCode (401) ؛ ctx.setResponseBody ("{/" result/":/" كلمة المرور غير صحيحة!/"}") ؛ ctx.set ("issuccess" ، false) ؛ العودة لاغية. }} Override public boolean shouldfilter () {requestContext ctx = requestContext.getCurrentContext () ؛ Return (Boolean) ctx.get ("issuccess") ؛ // إذا كانت نتيجة المرشح السابق صحيحة ، فهذا يعني أن المرشح السابق كان ناجحًا ويحتاج إلى إدخال المرشح الحالي. إذا كانت نتيجة المرشح السابق خاطئة ، فهذا يعني أن المرشح السابق لم ينجح. ليست هناك حاجة لإجراء إجراء التصفية التالي. تخطي جميع المرشحات اللاحقة وإرجاع النتيجة} Override public int filterorder () {return 1 ؛ // تم تعيين الأولوية على 1} Override Public String FilterType () {return "pre" ؛ }} قم بإنشاء مرشح منشور في النهاية
حزمة com.chhliu.springcloud.zuul ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد com.netflix.zuul.zuulfilter ؛ استيراد com.netflix.zuul.context.requestContext ؛ الفئة العامة AccessTokenFilter يمتد Zuulfilter {Override الكائن العام Run () {requestContext ctx = requestContext.getCurrentContext () ؛ httpservletrequest request = ctx.getRequest () ؛ system.out.println (string.format ("٪ s accessTokenFilter request to ٪ s" ، request.getMethod () ، request.getRequesturl (). toString ())) ؛ ctx.setsendzuulresponse (صواب) ؛ CTX.SetResponsestatusCode (200) ؛ ctx.setResponseBody ("{/" name/":/" chhliu/"}") ؛ // إخراج النتيجة النهائية null ؛ } Override public boolean shouldfilter () {return true ؛ } Override public int filterorder () {return 0 ؛ } Override Public String FilterType () {return "post" ؛ // بعد معالجة الطلب ، سيتم إدخال المرشح}} 2. في الفئة الرئيسية ، قم بتشغيل المرشحين الأولين
bean public AccessUserNameFilter AccessUserNameFilter () {return new AccessUserNameFilter () ؛ } bean public AccessPasswordFilter AccessPasswordFilter () {return New AccessPasswordFilter () ؛ } 3. أدخل الطلب والتحقق
(1) الطلب هو: http: // localhost: 8768/h2service/user/1؟ username = chhliu
نتيجة الاختبار هي: {"result": "كلمة المرور غير صحيحة!"}
نتائج طباعة وحدة التحكم
احصل على طلب AccessuserNameFilter إلى http: // localhost: 8768/h2service/user/1
احصل على طلب AccessPasswordFilter إلى http: // localhost: 8768/h2service/user/1
مرشح AccessUsernameFilter الذي تم تمريره ، فشل عند التحقق من مرشح AccessPasswordFilter
لا توجد طباعة SQL في الخلفية ، مما يعني أن الطلب لم يتم توجيهه
(2) الطلب هو: http: // localhost: 8768/h2service/user/1؟ password = 123456
نتيجة الاختبار هي: {"النتيجة": "اسم المستخدم غير صحيح!"}
نتائج طباعة وحدة التحكم:
احصل على طلب AccessuserNameFilter إلى http: // localhost: 8768/h2service/user/1
وهذا يعني أنه تم الوصول إلى مرشح AccessuserNameFilter ، ولكن لم يتم الوصول إلى مرشح AccessPasswordFilter. نظرًا لأن مرشح AccessuserNameFilter له أولوية أعلى ، سيتم تنفيذه أولاً. عند التنفيذ ، تبين أن شروط المرشح لا تلبي ، لذلك يتم تخطي جميع المرشحات بعد ذلك ويتم إرجاع النتيجة دون طباعة SQL في الخلفية ، مما يشير إلى أنه لم يتم توجيه الطلب.
(3) الطلب هو: http: // localhost: 8768/h2service/user/1؟ password = 123456 & username = chhliu
نتائج الاختبار هي:
{
"معرف": 1 ،
"اسم المستخدم": "user1" ،
"الاسم": "Zhang San" ،
"العمر": 20 ،
"الرصيد": 100.00
}
نتائج طباعة وحدة التحكم:
احصل على طلب AccessuserNameFilter إلى http: // localhost: 8768/h2service/user/1
احصل على طلب AccessPasswordFilter إلى http: // localhost: 8768/h2service/user/1
هذا يعني أنه يتم تنفيذ AccessuserNameFilter أولاً ثم يتم تنفيذ AccessPasswordFilter. وهذا يتفق مع أصغر قيمة الطلب التي ذكرناها سابقًا ، وكلما زادت الأولوية.
الخدمة المطلوبة في نفس الوقت لديها إخراج SQL:
hibernate: حدد user0_.id as id1_0_0_ ، user0_.age as Age2_0_0_ ، user0_.balance as balance3_0_0_ ، user0_.name as name4_0_0_ ، user0_.username as username5_0_ من user0_ user0_ where user0_.id =
يشير إلى أنه تم توجيه الطلب.
4. قم بتشغيل مرشح المنشور وقم بتشغيله مرة أخرى
نتيجة الاختبار: تم العثور على مرشح البريد ليتم تنفيذه آخر مرة ، على الرغم من أن أولويته هي 0
فيما يتعلق بدورة حياة مرشح Zuul ، انظر الشكل أدناه
ملاحظة: هناك خطأ صغير في الصورة أعلاه ، يجب أن يكون التوجيه مسارًا
5. توسيع
يوفر Zuul أيضًا نوعًا خاصًا من المرشح ، وهو: staticResponseFilter و SurgicalDebugfilter
StaticResponseFilter: يسمح StaticResponseFilter بتوليد الاستجابات من Zuul نفسها ، بدلاً من إعادة توجيه الطلب إلى المصدر.
SurgicalDebugfilter: يسمح SurgicalDebugfilter بتوجيه طلبات محددة إلى مجموعة أو مضيف تصحيح محدد.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.