ما الذي يسبب java.io.CharConversionException مع EOF أو رسائل HexDigit في Tomcat؟

StackOverflow https://stackoverflow.com/questions/105551

  •  01-07-2019
  •  | 
  •  

سؤال

يؤدي هذا الاستثناء إلى تسجيل بيانات كاتالينا الإنتاج لدينا من خلال استدعاء بسيط لـ "getParameter()".

WARNING: Parameters: Character decoding failed. Parameter skipped.

java.io.CharConversionException: EOF
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:82)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)

أو في بعض الأحيان:

java.io.CharConversionException: isHexDigit
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:87)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)
هل كانت مفيدة؟

المحلول

مجرد افتراض هنا.يبدو أن فك تشفير URL للمعلمات أو قيمها قد فشل (ترميز URL يعني تشفير بعض الأحرف باستخدام تدوين %XX أو %XXXX حيث XX أو XXXX هو الرمز السداسي العشري للحرف في ISO-8859-1 أو Unicode).في الحالة الأولى، قد يحدث الخطأ بسبب عدم وجود أحرف سداسية عشرية كافية بعد الحرف %.في الحالة الثانية، قد يحدث هذا لأن الحرف الذي يلي الحرف % ليس رقمًا سداسيًا عشريًا.

نصائح أخرى

هناك شيء آخر يجب التحقيق فيه وهو URIEncoding في ملف تكوين Tomcat "الموصل". إذا كان الرابط موجودًا في صفحة بترميز UTF-8، فسيقوم بتشفير عنوان URL إلى وحدات البايت باستخدام UTF-8، ثم يقوم عنوان URL بتشفير أي من وحدات البايت التي تحتاج إليها.ومع ذلك، افتراضيًا، يعتقد Tomcat أن تلك البايتات هي ISO-8859-1، مما قد يؤدي إلى حدوث مشكلات.

وقد يكون العكس صحيحاً أيضاً:إذا كانت الصفحة هي ISO-8859-1، وتم تعيين URIEncoding الخاص بـ Tomcat على UTF-8، فقد يحدث خطأ مماثل.

وفيما يلي مناقشة مفيدة حول القضايا في هذا المجال: مخاطر مجموعة الأحرف في حاويات JSP/Servlet

بدأت أتلقى هذا الخطأ عندما كان المستخدمون يرسلون '%' عبر طلب ajax.تبين أنني لم أهرب من المعلمات قبل تقديم الطلب.يتم تناول كتابة كاملة لهذا السيناريو والإصلاح في هذا مشاركة مدونة

يمكن أن يكون هذا أيضًا (من ويكيبيديا):

يوجد ترميز غير قياسي لأحرف Unicode:%xxxx، حيث xxxx هي قيمة Unicode ممثلة بأربعة أرقام سداسية عشرية.لم يتم تحديد هذا السلوك بواسطة أي RFC وتم رفضه بواسطة W3C.لا يزال الإصدار الثالث من ECMA-262 يتضمن وظيفة هروب (سلسلة) تستخدم بناء الجملة هذا، ولكن أيضًا وظيفة encodeURI (uri) التي تتحول إلى UTF-8 وترميز النسبة المئوية لكل ثماني بتات.

لذا، من الممكن أن تستخدم وظيفة الهروب القديمة في Javascript، ولكن نظرًا لأن الإصدارات الأحدث من Tomcat أكثر صرامة بشأن مثل هذه الأشياء (5.5.17 دع شريحة التشفير هذه)، الآن فقط بدأت ترى الاستثناءات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top