如何在 URL 中传递多个参数?
Posted
技术标签:
【中文标题】如何在 URL 中传递多个参数?【英文标题】:How do I pass multiple parameter in URL? 【发布时间】:2012-06-12 04:55:46 【问题描述】:我想弄清楚如何在 URL 中传递多个参数。我想将 android 类中的纬度和经度传递给 java servlet。我该怎么做?
URL url;
double lat=touchedPoint.getLatitudeE6() / 1E6;
double lon=touchedPoint.getLongitudeE6() / 1E6;
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+lon);
在这种情况下,输出(写入文件)是28.53438677.472097
。
这是可行的,但我想在两个单独的参数中传递纬度和经度,以便减少我在服务器端的工作。如果不可能,我如何至少在lat
和lon
之间添加一个空格,以便我可以使用tokenizer
类来获取我的纬度和经度。我尝试了以下行但无济于事。
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+" "+lon);
output- Nothing is written to file
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&?param2="+lon);
output- 28.534386 (Only Latitude)
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"?param2="+lon);
output- 28.532577?param2=77.502996
我的servlet代码如下:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
final String par1 = req.getParameter("param1");
final String par2 = req.getParameter("param2");
FileWriter fstream = new FileWriter("C:\\Users\\Hitchhiker\\Desktop\\out2.txt");
BufferedWriter out = new BufferedWriter(fstream);
out.write(par1);
out.append(par2);
out.close();
我还想知道这是将数据从 android 设备传递到服务器的最安全可靠的方式。
【问题讨论】:
应该是&param2
而不是?param2
【参考方案1】:
您可以将多个参数传递为“?param1=value1&param2=value2
”
但这并不安全。它容易受到 Cross Site Scripting (XSS) Attack
的攻击。
您的参数可以简单地替换为脚本。
看看这个article和article
您可以使用StringEscapeUtils 的 API 使其安全
static String escapehtml(String str)
Escapes the characters in a String using HTML entities.
即使在没有上述预防措施的情况下使用https
url 来确保安全也不是一个好习惯。
查看相关的 SE 问题:
Is URLEncoder.encode(string, "UTF-8") a poor validation?
【讨论】:
我在StringEscapeUtils
中看不到任何正确编码 URL 参数的内容,并且 URLEncoder
已经存在。
更新了相关 SE 问题的答案。【参考方案2】:
这个
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"¶m2="+lon);
必须工作。不管什么奇怪的原因1,你需要?
在第一个参数之前和&
在后面的参数之前。
使用复合参数,如
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"_"+lon);
也可以,但肯定不好。您不能在此处使用空格,因为它在 URL 中是被禁止的,但您可以将其编码为 %20
或 +
(但这是更糟糕的风格)。
1 声明?
将路径和参数分开,&
将参数彼此分开并不能解释原因。一些 RFC 说“use ? there and & there”,但我不明白他们为什么不选择相同的字符。
【讨论】:
谢谢,工作就像一个魅力。 :) 您能否也请回答我的最后一个问题,这是最安全的方法吗?我正在开发的应用程序将在市场上部署,因此有必要对其进行保护。 关于安全性,答案肯定取决于您需要什么样的安全性。如果您想防止未经授权使用您的应用程序,您可能会失锁。对于安全通信,HTTPS
通常是要走的路。在客户端你只需要添加一个“s”,在服务器端你需要一个私钥和一个由 CA 签名的证书。或者你可以自己运行,这需要更多的工作。但是......这是一个不同的问题,发布它。
这不是一个奇怪的原因。 ?
不是查询字符串的一部分。它只是请求 URI 和请求查询字符串之间的分隔符。查询字符串参数对又需要&
作为分隔符。查询字符串参数名称和值对又需要=
作为分隔符。顺便说一下,查询字符串中的空格应编码为+
。 %20
仅适用于请求 URI 部分。您可以使用URLEncoder#encode()
对查询字符串组件进行编码。另见***.com/questions/2793150
我明白了,但是something?a=1?b=2
会更容易编写和解析;使用&
而不是?
作为分隔符没有任何合乎逻辑的理由。 AFAIK +
只是 ` ` 的便捷快捷方式,URLDecoder
也接受 %20
。
这种格式在 LDAP 中以各种方式使用,但开始辩论大约在 1992 年做出的决定是徒劳的。@BalusC 关于编码要求是正确的。您不能依赖一种特定 API 的方式。不是所有东西都是 Java 并且不是 Java 中的所有东西都被URLDecoder.
解码【参考方案3】:
我对 Java 了解不多,但是 URL 查询参数应该用“&”分隔,而不是“?”
https://www.rfc-editor.org/rfc/rfc3986 是使用“sub-delim”作为关键字进行参考的好地方。 http://en.wikipedia.org/wiki/Query_string 是另一个很好的来源。
【讨论】:
以上是关于如何在 URL 中传递多个参数?的主要内容,如果未能解决你的问题,请参考以下文章
Next js - 如何在 url 中为 api 传递多个参数?