هل MyFaces Wextensionsfilter تغيير ترميز الصفحة؟
سؤال
قبل يومين بدأت في استخدام مكونات 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" %>