문제

이틀 전에 나는 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" %>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top