سؤال

قبل يومين بدأت في استخدام مكونات Tomahawk Extensionsfilter Im تطبيقي JSF. لقد لاحظت أن جميع تنبيهات JavaScript لم تعرض أحرفا خاصة (ç، ã، ó ô)، فإنها تعرض أشياء مثل # 231 بدلا من ذلك. عندما أقوم بإزالة ExtensionsFilter من ملف Web.xml الخاص بي، يعرض JavaScript AllRright. كان لدى أي شخص هذه المشكلة من قبل؟
شكرا مقدما.

تحرير: تمكنت من حل المشكلة عن طريق إنشاء عامل تصفية قبل ExtenttionFilter، هذا عامل التصفية الجديد يجبر إيقاف تشغيل الطلب على UTF-8. ولكن هذا حل قبيح، حل أفضل، كما قال بلك، سيكون للتخلص من جميع جافا سكريبت المضمنة.
شكرا لكم جميعا على المساعدة!

هل كانت مفيدة؟

المحلول

بعض الأفكار الأخرى:

  • إضافة مرشح الذي يستدعي setcontenttype. أو setcharacterencoding. وهذا قبل جميع المرشحات الأخرى
  • ضبط الخاصية -Dfile.encoding
  • رد جافا سكريبت window.alert بحيث يهرب من الشخصيات

يبدو أن هذا يعمل، ولكنه سيكون اختراق قبيح للغاية للغاية. سيكون هذا محدودا للغاية ولن يعمل إذا قام JavaScript بمحدد نصوص أخرى، مثل محتوى A div.

var hack = window.alert;
window.alert = function( text ) {
    hack( text + ' was converted' );
};
alert('hello');

تحديث:

هنا هو التسلسل المشتبه به:

1) ملحقات اعتراض الطلب

2) يحتوي Extensionsfilter

  154   // only parse HTML responses
  155   if (extendedResponse.getContentType() != null && isValidContentType(extendedResponse.getContentType()))
  156   {
        ...
  172        // writes the response
  173        addResource.writeResponse(extendedRequest, servletResponse);
  174    }
  175   else
  176   {
  178        byte[] responseArray = extendedResponse.getBytes();
  180        if(responseArray.length > 0)
  181       {
  182       // When not filtering due to not valid content-type, deliver the byte-array instead of a charset-converted string.
  183       // Otherwise a binary stream gets corrupted.
  184       servletResponse.getOutputStream().write(responseArray);
  185     }

3) defaultaddresource. الاستخدامات HTMLResponseWriterimpl. التي تستخدم UnicodeEncoder..

4) جميع "الأحرف اللاتينية غير الأساسية" يتم تشفيرها بعد ذلك.

خاتمة

  • إذا قمت بتعيين نوع المحتوى إلى شيء غير صالح، فسيقوم Extensionsfilter بالتخلف عن فرع "آخر" ولن ترميز الاستجابة. ولكن، ثم من المحتمل أن يتم كسر الملحقات.
  • التغيير المتغير ليس له أي تأثير، لا file.encoding
  • إنشاء مرشح إضافي للالتفاف مرة أخرى الاستجابة والعودة بعض من &#xx; يمكن أن تعمل ولكنها قبيحة للغاية.

ليس لدي أفكار أخرى في الوقت الحالي، لكنني مهتم بالإجابة كما صدمت أيضا حول مشكلة الترميز التي كانت مزعجة.


تحديث 2:

هل يمكن أن تعطي محاولة جيوب لتغيير الجزء فقط من مكتبة MyFaces التي تتعلق بنموذج الترميز داخل المرشح. وفقا لفهي cflow و ال call PointCut Pickings، قد يعترض شيء مثل هذا الترميز عند حدوثه من المرشح. إذا قام هذا التعريف بإنشاء تدخلات أخرى في معالجة الطلب، فقد ترغب في النظر في الدعوة أيضا addResource.writeResponse للحد من مزيد من الاتفاقية.

public aspect SkipEncoding {  
    pointcut encodingInExtFilter() : 
        cflow( * org.apache.myfaces.webapp.filter. ExtensionsFilter.doFilter(..) ) && 
        call ( String UnicodeEncoder.encode( String, bool, bool ));   
    around( String s, bool b1, bool b2 ) : encodingInExtFilter
    {
        return s; // skip encoding
    }
}

نصائح أخرى

يهرب من كيانات XML. ومع ذلك، يعتبر أيضا ممارسة سيئة لخدمة رمز JavaScript مضمن في ملف JSP / XHTML. خارجها في الملف الخاص به الذي تحدده <script src="path/to/file.js"></script> (على الأقل، يجب عدم تغطية عنوان URL الخاص به من قبل المرشح) وينبغي أن تختفي هذه المشكلة بالذات.

بالمناسبة، هل لديك أي من هذه في صفحات JSP الخاصة بك:

<?xml version="1.0" encoding="utf-8"?>

أو

<%@ page pageEncoding="utf-8" %>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top