Jetty:java.lang.IllegalArgumentException:编码无效
使用嵌入式Jetty(Jetty:java.lang.IllegalArgumentException:编码无效,java,jetty,Java,Jetty,使用嵌入式Jetty(9.4.5.v20170502),使用servlet处理程序,以及URL: http://localhost:8081/?para=%u65E5 (此URL由Chrome发送,因为流量被嗅探到另一台生产服务器) 我需要使用Jetty为这个场景准备一个测试用例 有一个错误: org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query at org.eclipse.jetty.s
9.4.5.v20170502
),使用servlet处理程序,以及URL:
http://localhost:8081/?para=%u65E5
(此URL由Chrome发送,因为流量被嗅探到另一台生产服务器)
我需要使用Jetty为这个场景准备一个测试用例
有一个错误:
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query
at org.eclipse.jetty.server.Request.getParameters(Request.java:388)
at org.eclipse.jetty.server.Request.getParameterNames(Request.java:1036)
at MyServlet.service(MyServlet.java:15)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
这源自:
java.lang.IllegalArgumentException: Not valid encoding '%u6'
at org.eclipse.jetty.util.UrlEncoded.decodeHexByte(UrlEncoded.java:889)
at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:354)
at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:296)
at org.eclipse.jetty.http.HttpURI.decodeQueryTo(HttpURI.java:615)
at org.eclipse.jetty.server.Request.extractQueryParameters(Request.java:420)
at org.eclipse.jetty.server.Request.getParameters(Request.java:384)
at org.eclipse.jetty.server.Request.getParameterNames(Request.java:1036)
at MyServlet.service(MyServlet.java:15)
但是,在使用时,调用request.getParameterNames()
时,同一URL没有错误
主要类别:
public class JettyTest {
public static void main(String[] args) throws Exception {
final Server server = new Server(8081);
// doesn't work
server.setHandler(getServletHandler());
// works
// server.setHandler(new HelloHandler());
server.start();
}
private static Handler getServletHandler() throws IOException {
final WebAppContext context = new WebAppContext();
context.setContextPath("/");
context.setResourceBase(".");
final String pathSpec = "/*";
final Class<? extends Servlet> servlet = MyServlet.class;
context.addServlet(servlet, pathSpec);
final WebAppClassLoader loader = new WebAppClassLoader(context);
context.setClassLoader(loader);
return context;
}
}
公共类JettyTest{
公共静态void main(字符串[]args)引发异常{
最终服务器=新服务器(8081);
//不起作用
setHandler(getServletHandler());
//工作
//setHandler(新的HelloHandler());
server.start();
}
私有静态处理程序getServletHandler()引发IOException{
最终WebAppContext上下文=新的WebAppContext();
context.setContextPath(“/”);
context.setResourceBase(“.”);
最终字符串pathSpec=“/*”;
最后一个类这似乎是Jetty中的一个bug。用户可以创建一个导致Jetty无法处理请求的URL
在Jetty 9.4.15上,我发现它非常简单,只需将?%%0附加到URL。处理URL的代码尝试访问查询参数时,Jetty就会抛出一个异常:
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query
现在,我想说没有一个好的解决方案或解决办法
可能只有当恶意用户测试您的站点的弱点时才会发生这种情况。在这种情况下,Jetty停止处理而不是继续处理坏数据可能是可以接受的。这似乎是Jetty中的一个错误。用户可以创建一个URL,导致Jetty无法处理请求
在Jetty 9.4.15上,我发现它非常简单,只需将?%%0附加到URL。处理URL的代码尝试访问查询参数时,Jetty就会抛出一个异常:
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query
现在,我想说没有一个好的解决方案或解决办法
可能只有当恶意用户在测试您的站点的弱点时才会发生这种情况。在这种情况下,Jetty停止处理而不是继续处理坏数据可能是可以接受的。简单的解决方案:我只是在浏览器应用程序的javascript中使用“encodeURI(url)”(在ajax功能之前)问题得到了解决简单的解决方案:我在浏览器应用程序中使用javascript中的“encodeURI(url)”(在ajax函数之前)问题已解决您的url未进行属性编码。请尝试此urlhttp://localhost:8081/?para=%25u65E5
参数值由Chrome按原样发送,另一台生产服务器不会抱怨。您的url不是属性编码的。请尝试此urlhttp://localhost:8081/?para=%25u65E5
参数值按原样发送通过Chrome,另一个生产服务器没有抱怨。
org.eclipse.jetty.http.BadMessageException: 400: Unable to parse URI query