jetty的uri内的GB2132编码特殊编码处理,NotUtf8Exception: Not valid UTF8! byte D0 in state 2

问题描述:

        客户端对 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值