نرسل بشكل أساسي طلبات إلى الخادم من خلال نموذجين من التقديم: URL والشكل. النموذج عمومًا لا يعاني من مشاكل مشوهة ، والمشاكل المشوهة على عنوان URL بشكل أساسي. من خلال إدخال المدونات السابقة ، نعلم أن عملية إرسال الطلب الترميز إلى الخادم بواسطة عنوان URL أمر مربك للغاية. ستؤدي أنظمة التشغيل المختلفة والمتصفحات المختلفة ومجموعات أحرف الويب المختلفة إلى نتائج تشفير مختلفة تمامًا. أليس الأمر مخيفًا للغاية إذا أراد المبرمجون أخذ كل نتيجة في الاعتبار؟ هل هناك طريقة للتأكد من أن العميل يستخدم طريقة ترميز واحدة فقط لإصدار طلب إلى الخادم؟
يملك! هنا أقدم الأساليب التالية بشكل أساسي
1. جافا سكريبت
استخدام ترميز JavaScript لا يمنح المتصفح فرصة للتدخل. بعد الترميز ، أرسل طلبًا إلى الخادم ثم فك تشفيره في الخادم. عند إتقان هذه الطريقة ، نحتاج إلى ثلاث طرق لترميز JavaScript: Escape () و Encodeuri () و EncodeUricomponent ().
يهرب
يتم ترميز السلسلة المحددة باستخدام مجموعة الأحرف اللاتينية SIO. يتم تشفير جميع الأحرف غير ASCII كسلاسل بتنسيق ٪ XX ، حيث يمثل XX الرقم السداسي المقابل للحرف في مجموعة الأحرف. على سبيل المثال ، الترميز المقابل للتنسيق هو ٪ 20. طريقة فك التشفير المقابلة هي unescape ().
في الواقع ، لا يمكن استخدام Escape () مباشرة لتشفير عنوان URL ، وتتمثل وظيفتها الحقيقية في إرجاع القيمة المشفرة أحادية الطابع. على سبيل المثال ، تكون نتيجة "I am cm" أعلاه ٪ U6211 ٪ U662FCM ، حيث يكون الترميز المقابل لـ "I" 6211 ، وترميز "نعم" هو 662F ، وترميز "CM" هو CM.
لاحظ أن Escape () غير صحيح لترميز "+". لكننا نعلم أنه إذا كانت هناك مسافات على صفحة الويب عند إرسال النموذج ، فسيتم تحويله إلى أحرف +. عندما يقوم الخادم بمعالجة البيانات ، ستتم معالجة علامة + في مسافات. لذلك ، كن حذرا عند استخدامه.
Encodeuri
ترميز عنوان URL بأكمله ، يستخدم تنسيق UTF-8 لإخراج السلسلة المشفرة. ومع ذلك ، لن يقوم Encodeuri بتشفير بعض الأحرف الخاصة باستثناء ترميز ASCII ، مثل:! @ # $ & * () =: / ؛ ؟ + '.
EncodeUricOpment ()
تحويل سلاسل URI إلى سلاسل تنسيق الهروب بتنسيق ترميز UTF-8. بالمقارنة مع Encodeuri ، سيكون EncodeUricomponent أكثر قوة ، وسيتم ترميزه للرموز (؛ /؟: @ & = + $ ، #) التي لم يتم ترميزها في Encodeuri (). ومع ذلك ، فإن EncodeUricomponent لن يقوم فقط بتشفير مكونات عنوان URL بشكل فردي ، ولن يتم استخدامه لترميز عنوان URL بالكامل. طريقة دالة فك تشفير المقابلة.
بالطبع ، نستخدم عادة حزب Encodeuri لأداء عمليات الترميز. إن ما يسمى بترميز JavaScript وفك تشفيره مرتين في الخلفية هو استخدام هذه الطريقة. هناك حلان لحل هذه المشكلة في JavaScript: Transcode و اثنين من طريقتان الترميز.
ترميز مرة واحدة
ترميز JavaScript:
var url = '/showMoBlieQrcode.Servlet؟name=i Am cm' ؛ window.location.href = encodeuri (url) ؛
عنوان URL transcoded: http://127.0.0.1:8080/perbank/ShowMoBlieQrcode.Servlet؟name=٪E6٪88٪91٪900٪98٪AFCM
معالجة الخلفية:
اسم السلسلة = request.getParameter ("name") ؛ System.out.println ("المعلمات الواردة المقدمة:" + name) ؛ name = new string (name.getBytes ("ISO-8859-1") ، "UTF-8") ؛ system.out.println ("المعلمات decoded:" + name) ؛نتيجة الإخراج:
المعلمات الواردة في مكتب الاستقبال: ؟؟؟؟؟؟
بعد فك تشفير المعلمات: أنا سم
الترميز الثانوي
جافا سكريبت
var url = '/showmoBlieQrcode.Servlet؟name=i Am cm' ؛ window.location.href = encodeuri (encodeuri (url)) ؛
URL TranscoDed:
معالجة الخلفية:
اسم السلسلة = request.getParameter ("name") ؛ System.out.println ("المعلمات الواردة المقدمة:" + name) ؛ name = urldecoder.decode (name ، "utf-8") ؛ system.out.println ("المعلمات decoded:" + name) ؛نتيجة الإخراج:
المعلمات الواردة في الواجهة الأمامية: E68891E698AFCM
بعد فك تشفير المعلمات: أنا سم
فلتر
باستخدام المرشحات ، يوفر Filter LZ نوعين ، الأول هو تعيين الترميز ، والثاني هو إجراء عمليات فك التشفير مباشرة في المرشح.
مرشح 1
يعين هذا المرشح مباشرة تنسيق الترميز للطلب.
طبقة الطبقة العامة تنفس الأدوات تصفية {private filterConfig config ؛ سلسلة ترميز = فارغة ؛ void public dorder () {config = null ؛ } public void dofilter (طلب servletRequest ، استجابة servletResponse ، سلسلة filterchain) يلقي ioException ، servleTexception {request.setcharacterencoding (الترميز) ؛ Chain.dofilter (طلب ، استجابة) ؛ } public void init (filterConfig config) يلقي servleTexception {this.config = config ؛ // الحصول على معلمات التكوين string str = config.getInitParameter ("الترميز") ؛ if (str! = null) {الترميز = str ؛ }}} إعدادات:
<Ivilter> <ilter-name> inchoyencodingfilter-name> <iliter-class> com.test.filter.characterencodingfilter-class> <Ing-param> <Param-name> encodingparam-name> <Param-value> utf-8param-value> init-param> filter> <Url-pattern>/*url-pattern> filter-mapping>
مرشح 2
في طريقة المعالجة ، يقوم المرشح بفك تشفير المعلمات مباشرة ، ثم يعيد تعيين المعلمات التي تم فك تشفيرها إلى سمة الطلب.
طبقة الطبقة العامة الأدوات مرشح {FilterConfig FilterConfig المحمية ؛ سلسلة ترميز = فارغة ؛ void public dorder () {this.filterConfig = null ؛ } / *** تهيئة* / public void init (filterConfig filterConfig) {this.filterConfig = filterConfig ؛ } / *** تحويل instr إلى نموذج ترميز UTF -8** param instrate enter string* @REGRUNT UTF - سلسلة ترميز 8* throws unsupportedencodingexception* / private string toutf (string instr) يلقي unsupportedEncodingException {String outstr = "" ؛ if (instr! = null) {Outstr = new string (instr.getBytes ("ISO-8859-1") ، "UTF-8") ؛ } إرجاع Outstr ؛ } / *** معالجة التصفية الصينية المشوهة* / public void dofilter (servletrequest servletrequest ، servletResponse ServletResponse ، سلسلة filterchain) يلقي iOexception ، servleTexception {httpservletrequest request = (httpservledrequest) servleTrequest ؛ httpservletresponse استجابة = (httpservletresponse) servletResponse ؛ // طريقة الحصول على الطلب (1.post أو 2.get) ، ويتم تنفيذ معالجة مختلفة وفقًا لطرق سلسلة طرق مختلفة = request.getMethod () ؛ // 1. للطلبات المقدمة في المنشور ، قم بتعيين الترميز مباشرة على UTF-8 if (method.equalsignorecase ("post")) {try {request.setcharacterencoding ("utf-8") ؛ } catch (UnsupportedEncodingException e) {E.PrintStackTrace () ؛ }} // 2. طلب تم إرساله في GET else {// الحصول على إخراج المعلمة التي يتم تقديمها بواسطة paramnames التعداد العميل = request.getParameterNames () ؛ . (int i = 0 ؛ i <border.length ؛ i ++) {try {// circle back واتصل بكل قيمة toutf (القيم [i]) لتحويل تشفير حرف لسلسلة قيمة المعلمة vlustr = toutf (القيم [i]) ؛ القيم [i] = vlustr ؛ } catch (UnsupportedEncodingException e) {E.PrintStackTrace () ؛ }} // إخفاء القيمة في شكل سمة في طلب request.setAttribute (الاسم ، القيم) ؛ }}} // قم بتعيين طريقة الاستجابة ودعم مجموعة الأحرف الصينية. // تواصل تنفيذ المرشح التالي. إذا لم يكن هناك مرشح ، فإن سلسلة الطلب. dofilter (طلب ، استجابة) ؛ }}إعدادات:
<Ivilter> <ilter-name> inchoenencodingfilter-name> <iliter-class> com.test.filter.characterencodingfilter-class> filter> <filter mapping> <filter-name> choachenencodingfilter-name> <Url-patern>/*url-patern> mappappip
آخر
1. تعيين pageencoding و contentType
<٪@ page language = "java" contentType = "text/html ؛
charset = utf-8 "pageenCoding =" UTF-8 "٪>
2. قم بإعداد uriencoding من tomcat
بشكل افتراضي ، يستخدم خادم Tomcat تنسيق الترميز ISO-8859-1 لترميز عنوان URL المطلوب بواسطة معلمة uriencoding ، لذلك نحتاج فقط إلى إضافة uriencoding = "UTF-8" إلى علامة ملف server.xml من tomcat.
ما سبق هو كل شيء عن هذا المقال. آمل أن يكون من المفيد للجميع أن يتعلموا أسئلة جافا الصينية.