MyFaces ExtensionSFilter Page Page 인코딩이 변경됩니까?
문제
이틀 전에 나는 Tomahawk ExtensionsFilter 구성 요소 IM JSF 응용 프로그램을 사용하기 시작했습니다. 모든 JavaScript 알림이 특수 문자 (Ç, Â, Ó ô)를 표시하지 않는다는 것을 알았습니다. 대신 #231과 같은 것을 표시합니다. 내 web.xml 파일에서 ExtensionSfilter를 제거하면 JavaScript가 allright를 표시합니다. 전에이 문제를 겪은 사람이 있습니까?
미리 감사드립니다.
편집 : ExtensionFilter 앞에 필터를 만들어 문제를 해결할 수 있었으며,이 새 필터는 요청 charset을 UTF-8로 강제합니다. 그러나 이것은 Balusc가 말했듯이 더 나은 솔루션 인 추악한 솔루션입니다. 모든 인라인 JavaScript를 제거하는 것입니다.
도와 주셔서 감사합니다!
해결책
몇 가지 다른 아이디어 :
- 호출하는 필터를 추가하십시오 SetContentType 또는 setcharacterencoding 그리고 다른 모든 필터 앞에 있습니다
- 속성을 설정하십시오
-Dfile.encoding
- JavaScript를 다시 반드시하십시오
window.alert
캐릭터를 피할 수 있습니다
이것은 작동하는 것처럼 보이지만 매우 추악한 해킹 일 것입니다. 이것은 또한 매우 제한적이며 JavaScript가 다른 텍스트를 설정하는 경우, 예를 들어 div
.
var hack = window.alert;
window.alert = function( text ) {
hack( text + ' was converted' );
};
alert('hello');
업데이트:
의심되는 순서는 다음과 같습니다.
1) ExtensionsFilter 요청을 가로 채립니다
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 사용하는 유니 코드 코더.
4) 모든 "비 기본 라틴 문자"가 인코딩됩니다.
결론
- 컨텐츠 유형을 유효하지 않은 것으로 설정하면 ExtensionSFilter가 "else"브랜치로 기본값을 받고 응답을 인코딩하지 않습니다. 그러나 ExtensionsFilter는 아마도 깨 졌을 것입니다.
- SetCharacterEncoding을 변경하는 것은 아마도 효과가 없을 것입니다
file.encoding
- 추가 필터를 작성하여 응답을 다시 감싸고 일부를 되돌립니다.
&#xx;
효과가 있지만 매우 못 생겼습니다.
지금은 다른 아이디어가 없지만 성가신 문제를 인코딩하는 데 부딪히면서 답에 관심이 있습니다.
UPDATE 2:
당신은 시도 할 수 있습니다 종자 필터 내 인코딩 양식과 관련된 MyFaces 라이브러리의 일부만 변경합니다. 내 이해에 따르면 cflow
그리고 call
포인트 컷 선택은 이와 같은 것이 필터에서 발생할 때 인코딩을 가로 채울 수 있습니다. 이 정의가 요청 처리에서 다른 간섭을 생성하는 경우 호출을 고려할 수도 있습니다. 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 엔티티를 탈출합니다. 그러나 JSP/XHTML 파일에서 JavaScript 코드 인라인을 제공하는 것은 또한 불량한 관행으로 간주됩니다. 당신이 지정한 자체 파일로 외부화 <script src="path/to/file.js"></script>
(적어도 URL은 필터로 덮어서는 안되며이 특정 문제는 사라져야합니다.
그건 그렇고, 당신은 당신의 JSP 페이지에 이것들 중 하나가 있습니까?
<?xml version="1.0" encoding="utf-8"?>
또는
<%@ page pageEncoding="utf-8" %>