Java URL:无效查询
我的程序因格式化错误的URL查询而崩溃。 我使用以下方法来解析它Java URL:无效查询,java,url,Java,Url,我的程序因格式化错误的URL查询而崩溃。 我使用以下方法来解析它 public GetMethod get(String uri) throws IOException { URL url = new URL(uri); ProtocolSocketFactory factory = getFactory(url.getProtocol()); Protocol protocol = new Protocol(url.getProtocol(),
public GetMethod get(String uri) throws IOException {
URL url = new URL(uri);
ProtocolSocketFactory factory = getFactory(url.getProtocol());
Protocol protocol = new Protocol(url.getProtocol(), factory, url.getPort());
httpClient.getHostConfiguration().setHost(url.getHost(), url.getPort(), protocol);
GetMethod getMethod = new GetMethod(url.getPath() + "?" + url.getQuery());
httpClient.executeMethod(getMethod);
return getMethod;
}
uri可以包含以下内容,例如:
HH:mm:ss&NumberFormat=#,######:,&UserCurrency=EUR&ClientBrowserAddress=0.0.0
当我进入方法的构造函数并执行url.getQuery()时,我收到以下消息:
用户名=演示和权限=AC%2CAD%2CAR%2CAS%2CBP%2CBPA%2CBPS%2CDashboard%2CID%2CLUA%2CMA%2CME-IN%2CME-OUT%2CMEA-IN%2CMEA-IN%2CMES-IN%2CMES-OUT%2CMPC%2CREP%2CSF%2CUA%2CUPA%2CUPP和数据所有者=1,10,7,3,8,12,15,16,4,5,14,9,11,17,6,13,2&格式=年月日
HH:mm:ss和数字格式=
在我的号码表之后,一切都被删除了。这是怎么来的
更新
我将所有#替换为%23,现在我有以下方法:
public GetMethod get(String uri) throws IOException {
uri = uri.replaceAll("#","%23");
URL url = new URL(uri);
ProtocolSocketFactory factory = getFactory(url.getProtocol());
Protocol protocol = new Protocol(url.getProtocol(), factory, url.getPort());
httpClient.getHostConfiguration().setHost(url.getHost(), url.getPort(), protocol);
GetMethod getMethod = new GetMethod(url.getPath() + "?" + url.getQuery());
httpClient.executeMethod(getMethod);
return getMethod;
}
当我编码我的url时,我得到以下结果:
14:09:22027错误
[org.apache.catalina.core.ContainerBase.[jboss.web].[default host].[trax].[default]]
(http-/0.0.0:8080-2)JBWEB000236:Servlet.service()用于Servlet
默认引发异常:java.lang.IllegalArgumentException:无效
uri
“/Trax Logi Reports/rdTemplate/rdGetSecureKey.aspx?Username=demo&Rights=AC%2CAD%2CAR%2CAS%2CBP%2CBPA%2CBPS%2CDashboard%2CID%2CLUA%2CMA%2CME-IN%2CME-IN%2CMES-IN%2CMES-OUT%2CMPC%2CREP%2CSA%2CSF%2CUA%2CUPA%2CUPA%2CUPS&DataOwner=1,10,7,3,3,8,12,15,16,4,5,14,9,11,11,11,11,12,12,12,12,16,16,16,16,14,11,11,11,11,11,11,12,11,11,11,11,12,12,12,12,12,16,12,16,12,11,11,11,11,11,
HH:mm:ss&NumberFormat=%23,%23%230.%23%23&UserCurrency=EUR&ClientBrowserAddress=0.0.0':
无效查询
怎么了?我什么也看不到。这是因为&和#是URL中具有某种意义的特殊字符:
用于将参数彼此分离&
表示文件中的本地链接——该链接不会传递到服务器,但会在客户端(通常由浏览器)进行评估#
#
编码为%23
,您将看到更多信息
您还应该考虑使用适当的调用逐个设置PARAM:
GetMethod getMethod = new GetMethod(url.getPath());
getMethod.getParams().setParameter("Username", "demo");
依此类推使用URLEncoder.encode对新URL的纯文本字符串进行编码(“/Trax Logi Reports”),由于未指定协议,您将收到格式错误的异常。请更详细地描述您的控制流程。哪个部分由哪个URL调用?在DateTimeFormat中,yyyy和HH之间似乎有一个空格。URL/URI中不允许有空格。将其编码为%20(与任何其他不允许的字符一样)或+(加号;查询aka参数中空格的特殊情况)请参见..我也对其进行了编码,谢谢,但现在我得到:java.lang.IllegalArgumentException:无效uri“/Logi Reports/rdTemplate/rdGetSecureKey.aspx?Username=demo&Rights=AC%2CAD%2CAR%2CAS%2CBP%2CBPA%2CBPS%2CDashboard%2CID%2CLUA%2CMA%2CME-OUT%2CMEA-IN%2CMEA-OUT%2CMES-OUT%2CMPC%2CREP%2CSA%2CSF%2CUA%2CUPA%2CUPA%2CUPS&DataOwner=1,10,7,3,8 12,15,16,4,14,9,11,6,11,11,11,12,12,15,16,16,16,14,11,11,11,12,12,12,12,11,16,12,14,11,12,12,14,12,14,11,12,12,12,11,11,12,16,14,12,13,HH:mm:ss&NumberFormat=%23,%23%230.%23%23&UserCurrency=EUR&ClientBrowserAddress=0.0.0':无效查询从何处获取?您在服务器中看到了什么?