문제

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