2014-12-15 5 views
0

Latin-1 문자가있는 사용자 이름이 로그인 양식에 도입 된 문제를 조사하고 있습니다. 사용자 이름에 á 문자가 포함되어 있습니다.톰캣 영역에서 UTF-8로 인코딩 된 j_security_check 사용자 이름이 Latin-1로 잘못 디코딩되었습니다.

공용 클래스 MyRealm이 RealmBase이 영역 구현 확장 {(문자열 암호, 문자열 이름) 공공 교장 인증합니다 여기 을 구현 { ... 실제 인증} }

: 나는 내가 가지고있는 서버 부분을 조사 바이트를 출력하면 다음과 같습니다. username.getBytes() 해당 문자는 다음과 같습니다. C3 83 C2 A1 일반적으로 UTF8 인코딩을 사용하는 문자는 C3 A1입니다. 이것을 UTF8로 다시 인코딩하면 C3 소프트웨어가 무엇을 출력합니까?

네트워크 캡처에서 C3 A1에서 사용자 이름이 올바르게 전송되었는지 확인했는지 확인했습니다. 로그인 페이지 양식의 소스 코드는 다음과 같습니다

 <form name="loginForm" action="j_security_check" method="post" enctype="application/x-www-form-urlencoded"> 
     <table> 
      <tr> 
       <td colspan="2" align="right">Secure connection: 
        <input type="checkbox" name="checkbox" class="style5" onclick="javascript:httpHttps();"></td> 
      </tr> 
      <tr> 
       <td class="style5">Login:</td> 
       <td><input type="text" name="j_username" autocomplete="off" style="width:150px" /></td> 
      </tr> 

그래서 나는 클라이언트 측에서 아무 문제 (2 회 UTF8 변환)이 없다 생각합니다. 나는() 함수 이름 다음 인증이 잘 작동 하지만 난 사용자 이름의 인코딩을 찾아야한다 내 문제

에이 솔루션을 적용 할 두려워 인증 용으로 UTF8에서 두 번 다시 디코딩하는 경우 영역의 인증 (문자열 사용자 이름, 문자열 암호) 기능? 서버 측은 httpd-2.2.15 및 tomcat6-6.0.24가 포함 된 Linux (RedHat)에서 실행됩니다.

답변

1

예제에서 양식은 'á'에 대한 UTF-8 문자를 % 인코딩을 사용하는 Tomcat으로 보냅니다 (따라서 와이어를 통해 % C3 % A1 임). 그러나 Tomcat은 POST의 기본 인코딩 인 Latin1로 해석합니다.

그래서 Tomcat은 C3가 'á'이고 A1이 '¡'이므로 Latin1 인코딩에서 내부적으로 'á'로 C3A1을 저장합니다.

username.getBytes()를 요청하면 UTF-8로 인코딩 된 바이트 배열이 만들어 지므로 C383 C2A1 인 UTF-8 문자 집합에서 'á'의 두 문자를 찾습니다.

세부 사항 및 제안 솔루션이를 설명하는 FAQ : http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q3

변경 server.xml의 FormAuthenticator의 밸브 스택 Exchange로 characterEncoding="UTF-8"

<Context path="/YourSercureApp"> 
      <Valve 
      className="org.apache.catalina.authenticator.FormAuthenticator" 
      disableProxyCaching="false" 
      characterEncoding="UTF-8" /> 
    </Context> 
+0

에 오신 것을 환영를 지정하고 도움을 주셔서 감사합니다 . 이상적으로는 답변이 포함 된 솔루션이 링크가 아닌이 사이트의 코드와 함께 자체 포함되어야합니다. 그렇게하면 사이트가 재구성되고 내년에 같은 문제가있는 누군가가 stackoverflow를 방문하면 연결이 끊어지는 것에 대해 걱정할 필요가 없습니다. –