Tapestry 4.1.2의 국제화된 페이지 속성
-
09-06-2019 - |
문제
내 Tapestry 애플리케이션의 로그인 페이지에는 사용자가 입력한 비밀번호가 저장되어 데이터베이스의 값과 비교되는 속성이 있습니다.사용자가 다음과 같이 멀티바이트 문자로 비밀번호를 입력하는 경우:
áéíóú
...getPassword()(해당 속성에 대한 추상 메서드)의 반환 값을 검사하면 다음이 제공됩니다.
áéÃóú
분명히 제대로 인코딩되지 않았습니다.그러나 Firebug는 페이지가 UTF-8로 제공된다고 보고하므로 아마도 양식 제출 요청도 UTF-8로 인코딩될 것입니다.데이터베이스에서 가져온 값을 검사하면 올바른 문자열이 생성되므로 OS 또는 IDE 인코딩 문제로 보이지는 않습니다..application 파일의 org.apache.tapestry.output-encoding에 대한 Tapestry의 기본값을 재정의하지 않았으며 Tapestry 4 선적 서류 비치 속성의 기본값이 UTF-8임을 나타냅니다.
그렇다면 속성을 설정할 때 Tapestry가 인코딩을 잘못한 것처럼 보이는 이유는 무엇입니까?
관련 코드는 다음과 같습니다.
로그인.html
<html jwcid="@Shell" doctype='html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"' ...>
<body jwcid="@Body">
...
<form jwcid="@Form" listener="listener:attemptLogin" ...>
...
<input jwcid="password"/>
...
</form>
...
</body>
</html>
로그인 페이지
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification
PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
<page-specification class="mycode.Login">
...
<property name="password" />
...
<component id="password" type="TextField">
<binding name="value" value="password"/>
<binding name="hidden" value="true"/>
...
</component>
...
</page-specification>
Login.java
...
public abstract class Login extends BasePage {
...
public abstract String getPassword();
...
public void attemptLogin() {
// At this point, inspecting getPassword() returns
// the incorrectly encoded String.
}
...
}
업데이트
@얀 솔티스:글쎄, 데이터베이스에서 나오는 값을 검사하면 올바른 문자열이 표시되므로 내 편집기, OS 및 데이터베이스가 모두 값을 올바르게 인코딩하는 것 같습니다.내 .application 파일도 확인했습니다.org.apache.tapestry.output-encoding 항목이 포함되어 있지 않으며 Tapestry 4 선적 서류 비치 이 속성의 기본값이 UTF-8임을 나타냅니다.귀하의 질문에 대한 답변을 반영하여 위의 설명을 업데이트했습니다.
@내 자신:해결책을 찾았습니다.
해결책 2
문제를 발견했습니다.Tomcat은 Tapestry나 내 페이지 클래스에 문제가 생기기도 전에 매개변수를 엉망으로 만들고 있었습니다.원하는 문자 인코딩을 적용하는 서블릿 필터를 생성하면 문제가 해결되었습니다.
CharacterEncodingFilter.java
package mycode;
import java.io.IOException;
import javax.servlet.*;
/**
* Allows you to enforce a particular character encoding on incoming requests.
* @author Robert J. Walker
*/
public class CharacterEncodingFilter implements Filter {
private static final String ENCODINGPARAM = "encoding";
private String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter(ENCODINGPARAM);
if (encoding != null) {
encoding = encoding.trim();
}
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
public void destroy() {
// do nothing
}
}
web.xml
<web-app>
...
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>mycode.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/app/*</url-pattern>
</filter-mapping>
...
</web-app>
다른 팁
모든 것이 옳은 것 같습니다.
당신은 정말 확실해 getPassword()가 쓰레기를 반환합니까?비밀번호는 완벽할 수 있지만 다른 사람(편집자, OS, 데이터베이스 등)이 유니코드 문자열을 표시할 때 이를 모르는 것이 아닌가요?무엇 정확히 쓰레기라고 생각하게 만드나요?
또한 .application 구성 파일에 이상한 인코딩이 설정되어 있지 않은지 확인하겠습니다.
<meta key="org.apache.tapestry.output-encoding" value="some strange encoding"/>