jetty 在请求URI里传入非法字符,jetty会断开连接,导致nginx认为该节点不健康


jetty 在请求URI里传入非法字符(如直接一个16进制字节A1,非%A1,用抓包TCP工具发送),jetty抛出如下错误

8.1.0.RC1、

8.1.18.v20150929、

9.3好的

如果前面代理用nginx的proxy_next_upstream,会认为该节点失效,如果请求刷的厉害,有可能所有节点都被刷成不健康状态;导致nginx返回给用户502;

org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte Fd in state 0
	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.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Thread.java:695)

8.1.18在处理请求的时候,utf-8转码失败会使用ios-8859-1,找不到返回404

2015-11-16 15:37:43.763:WARN:oejs.AbstractHttpConnection:Failed UTF-8 decode for request path, trying ISO-8859-1

但是奇怪的是,在处理返回
Response.sendError,代码里调用
Request.getRequestURI,用utf-8转码,引起异常,导致直接关闭连接;

初步解决思路:

1.升9版本,但是jetty9.3默认是编译jdk8,jdk还在6跑着,风险不小

2.nginx改nginx_upstream_check_module

http://nolinux.blog.51cto.com/4824967/1594029

3.改下8.1.18的代码(手生哎)

4.proxy_next_upstream 最后加个max_fails=0的节点,反正前面都错了,这个节点撑着(没人故意刷你死不了);

jetty,nginx都不算熟悉,有大牛请指导、自己记录,误人勿怪!!!!

时间: 2024-10-22 23:07:01

jetty 在请求URI里传入非法字符,jetty会断开连接,导致nginx认为该节点不健康的相关文章

SharePoint 2013的限制(三)非法字符

SharePoint里有一些字符是不被允许使用的.比如SharePoint默认会阻止上传一些类型的文件,比如exe. 再比如,上传名字含有{}的文件,会得到如下提示: 除此之外,SharePoint还有很多的非法字符. 比如我新建一个名字为home.files的文件夹: 点击Save之后,SharePoint在后面给增加了一个下划线_. 那么都有哪些字符在SharePoint里是非法的呢?在 http://support.microsoft.com/en-us/kb/905231里面详细的介绍了

tomcat与jetty接收请求参数的区别

[场景]服务端点对点通知.A服务发起请求B服务,B同步返回接收成功:然后B开始处理逻辑:B处理完成后异步通知给A:A接收请求并处理,同步回写响应给B:完成. [先上代码]服务端(接收端)代码: 客户端(请求端)HttpUtil工具类: 客户端测试方法: [测试结论]Tomcat和jetty对于HttpServletRequest.getParameterMap()的处理不同.jetty可以直接获取到请求参数:而Tomcat获取不到.下面是Tomcat的日志: 六月 11, 2019 10:11:

关于javac编译时出现“非法字符:\65279”的解决方法

一般用UE或记事本编辑过的UTF-8的文件头会加入BOM标识,该标识由3个char组成.在UTF-8的标准里该BOM标识是可有可无的,Sun 的javac 在编译带有BOM的UTF-8的格式的文件时会出现"非法字符:\65279"的错误,但是用Eclipse进行编译却没有问题,原因在于Eclipse使用的是自己的JDT,而非javac,关于JDT的描述可以到eclipse的官网上去查看. 出现这种情况时,有两种解决方法: a) 利用UE.Editplus等文本编辑器重新保存文件为不带B

(一)Asp.net web api中的坑-【找不到与请求 URI匹配的 HTTP 资源】

在.net下,创建一个HTTP服务,有很多方案,比较老ashx,一般处理程序(HttpHandler), Web Service SOAP协议的,数据格式是XML,HTTP协议         WCF 基于SOAP的,数据格式是XML,可以支持各种各样的协议,像TCP,HTTP,HTTPS,Named Pipes, MSMQ. Web API(文章主讲) 简单的构建HTTP服务,.net平台上Web API 是一个开源的.理想的.构建REST-ful 服务的技术,支持MVC的特征,像路由.控制器

多次读取请求request里数据

如果请求是GET方法,可以直接通过getParameter(String param)方法读取指定参数,可读取多次: 而POST方法的参数是存储在输入流中,只能读一次,不能多次读取. 有时需要在filter里打印请求参数,因而在filter里读取post请求里的输入流后,会导致具体的controller里拿不到请求参数. 解决方法: 采用ThreadLocal,在filter里把读取到的post参数存入ThreadLocal里,而controller就可以再从ThreadLocal里把请求参数读

以一个闰年检测程序为例的非法字符异常输入检测

闰年:闰年(Leap Year)是为了弥补认为历法规定造成的年度天数与地球实际公转周期的时间差而设立的.补上时间差的年份为闰年. 简单来说,置润法则是:四年一闰,百年不闰,四百年再闰.即规定公历年份是整百数的,必须是400的倍数才是闰年,不是400的倍数的就是平年. 例如:1950-2050年间的闰年: 1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000, 2004,2008,2012,2016,2020,2024,2

#WEB安全基础 : HTTP协议 | 0x9 GET和POST请求以及请求URI的方式

请求URI的方式 1.URI为完整的请求URI GET http://hackr.jp/index.htm HTTP/1.1 2.在首部字段Host中写明域名或IP地址 GET/index.htm HTTP/1.1 Host:hackr.jp 3.用一个*代表请求(前提是:不是访问特定资源而是对服务器本身发器请求) OPITIONS * HTTP/1.1 //OPTION是获取访问的服务器支持的HTTP请求方法 GET和POST 首先我们先看一下GET请求 首先用任意一个浏览器打开网页:http

Spring Filter过滤表单中的非法字符

使用Spring Filter过滤表单中的非法字符 1 package test; 2 3 import java.io.IOException; 4 import java.util.Iterator; 5 import java.util.Map; 6 7 import javax.servlet.FilterChain; 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServletReque

IDEA导入一个新项目原来没有问题,出现非法字符正解

新导入一个项目,项目代码没有女人和问题 ,在Eclipse上面都能跑的起来,然后导入到IDEA中就不行了 ,出现非法字符 原来就遇到过这样的问题,解决了,没注意过一段时间有忘记了,今天下下啦,给大家提个醒,程序员真到要经常写博客 下面看下出现的问题的截图 原因是没有设置编码格式,到setting里面找到file encoding ,设置一下编码格式 好了,设置完毕后再次运行就没问你啦