如何在 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。 这是可行的,但我想在两个单独的参数中传递纬度和经度,以便减少我在服务器端的工作。如果不可能,我如何至少在latlon 之间添加一个空格,以便我可以使用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+"&param2="+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 传递多个参数?

如何使用react将多个参数作为url中的对象传递

如何传递不在 URL 中的多个参数?

如何使用 JavaScript 将包含多个数组的数组作为参数化 URL 传递

Scrapy中的Callback如何传递多个参数

如何使用 Url.Action 在 asp.net core 2.0 razor 页面中传递多个操作