2013-12-09 5 views
0

우리는 부두 컨테이너에 웹 애플리케이션을 실행하고 있습니다. jsp에는 forward가 있습니다. jsp : param의 값은 ISO-8859-1입니다. Jetty에게 URL이 ISO-8859-1임을 어떻게 알릴 수 있습니까?Embedded Jetty NotUtf8Exception

시스템 속성 org.eclipse.jetty.util.UrlEncoding.charset이 작동하지 않습니다. org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! incomplete UTF8 sequence...이 발생합니다. 조직 나는 방법 mergeQueryString의 소스 코드에서 발견 한

Caused by: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! incomplete UTF8 sequence 
    at org.eclipse.jetty.util.Utf8Appendable.checkState(Utf8Appendable.java:232) ~[jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.util.Utf8StringBuffer.getStringBuffer(Utf8StringBuffer.java:65) ~[jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.util.UrlEncoded.decodeString(UrlEncoded.java:843) ~[jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:221) ~[jetty-util-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.Request.mergeQueryString(Request.java:2172) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:229) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:101) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:792) ~[javax.servlet.jsp-2.3.2.jar:2.3.2] 
    at org.apache.jsp.WEB_002dINF.jsp.template.test_005jsp_jsp._jspService(test_005jsp_jsp.java:84) ~[na:na] 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111) ~[javax.servlet.jsp-2.3.2.jar:2.3.2] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[javax.servlet-api-3.1.0.jar:3.1.0] 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411) ~[javax.servlet.jsp-2.3.2.jar:2.3.2] 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473) ~[javax.servlet.jsp-2.3.2.jar:2.3.2] 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377) ~[javax.servlet.jsp-2.3.2.jar:2.3.2] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[javax.servlet-api-3.1.0.jar:3.1.0] 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:696) ~[jetty-servlet-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:526) [jetty-servlet-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:586) ~[jetty-security-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1110) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:453) [jetty-servlet-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1044) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:261) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:101) ~[jetty-server-9.1.0.v20131115.jar:9.1.0.v20131115] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_25] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_25] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_25] 
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_25] 
    at net.bull.javamelody.JspWrapper.invoke(JspWrapper.java:149) ~[javamelody-core-1.43.0.jar:1.43.0] 
    at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:271) ~[javamelody-core-1.43.0.jar:1.43.0] 
    at com.sun.proxy.$Proxy51.forward(Unknown Source) ~[na:na] 
    at org.apache.tiles.servlet.context.ServletTilesRequestContext.forward(ServletTilesRequestContext.java:241) ~[tiles-servlet-2.2.2.jar:2.2.2] 
    ... 94 common frames omitted 

(문자열 쿼리) 클래스 : 스택 트레이스 여기

<%@ page language="java" pageEncoding="ISO-8859-1" %> 
... 
<jsp:forward page="/forwardToAServlet"> 
<jsp:param name="param1" value="an+example+with+an+umlaut+gr%F6%DFere" /> 
</jsp:forward> 

그리고 다음은

은은 JSP의 예이다 .eclipse.jetty.server.Request 다음

UrlEncoded.decodeTo(query,parameters, StandardCharsets.UTF_8,-1); //have to assume UTF-8 because we can't know otherwise 

을 따라서 URLEncoded.decodeTo() UTF-8을 사용하는 방법 System.setProperty ("org.eclipse.jetty.util.UrlEncoding.charset", "ISO-8859-1") 인코딩 세트가 아닙니다.

어떻게 든이 문제를 해결할 수 있습니까? 어떤 아이디어? :-)

+0

문제의 예를 게시 할 수 있습니까? JSP/앞으로? –

+0

전체 스택 추적도 포함합니다. –

+0

주 :'org.eclipse.jetty.util.UrlEncoding.charset' 시스템 속성의 사용은'System.setProperty()'호출을 통해 내장되지 않고 명령 행에서만 작동합니다. –

답변

1

이것이 제티 9.1.0의 버그라고 생각됩니다.

그래서 나는 Dispatcher.forward() 필요가 Request.mergeQueryString()을 수행 할 것을 https://bugs.eclipse.org/423692

그것의 짧은시를 제기하지만, 어느 방지 들어오는 쿼리 문자열, that decoding step is hardcoded at UTF8 (HTTP의 기본을), 디코딩 것 즉로 org.eclipse.jetty.util.UrlEncoding.charset 속성에서 지정한 재정의 된 인코딩/문자 집합입니다.

Jetty 프로젝트의 HTTP 사양 리드는 이것이 Jetty 또는 HTTP 사양 요구 사항의 유효한 버그인지 여부를 평가하므로 그대로 두어야합니다.

웹에 대한 사실상의 인코딩이므로 UTF-8을 사용하는 것이 좋습니다. (예 : HTTP/2 사양의 초기 표시는 콘텐츠/문서 인코딩이 그대로 유지되지만 프로토콜 인코딩은 UTF-8에서 엄격하게 시행됨을 나타냄)