问题描述:
客户端对 uri的汉子编码采用了非洲的编码形式例如汉子“啊”的编码是单字节汉子编码,不是三字节,jetty无法解析汉字编码。
异常描述:
[qtp806588571-132] WARN org.eclipse.jetty.server.AbstractHttpConnection - Failed UTF-8 decode for request path, trying ISO-8859-1
[qtp806588571-132] WARN org.eclipse.jetty.io.nio - handle failed
org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte D0 in state 2
at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:178)
at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:117)
at org.eclipse.jetty.http.HttpURI.toUtf8String(HttpURI.java:503)
at org.eclipse.jetty.http.HttpURI.getPathAndParam(HttpURI.java:687)
at org.eclipse.jetty.server.Request.getRequestURI(Request.java:1024)
at org.eclipse.jetty.server.Response.sendError(Response.java:364)
at org.eclipse.jetty.server.Response.sendError(Response.java:419)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:603)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThre
解决方案:
修改jetty源码:httpURL类,在jetty-http中,添加汉字编码修改逻辑。
private int calByteslen(byte[] bytes, int start , int end){
int x = 0;
for (int i = start ; i < end;i++) {
if(bytes[i] < 0) x++;
}
return x*2;
}
public static String bytesToHexString(byte src){
StringBuilder stringBuilder = new StringBuilder("");
int v = src & 0xFF;
String hv = Integer.toHexString(v).toUpperCase();
if (hv.length() < 2) {
stringBuilder.append