47

我试图弄清楚如何在 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 设备传递到服务器的最安全可靠的方式。

4

3 回答 3

70

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 中是被禁止的,但您可以将其编码为%20or +(但这是更糟糕的风格)。


1 声明?将路径和参数&分开以及将参数彼此分开并不能解释任何原因。一些 RFC 说“使用?那里和那里”,但我不明白为什么他们没有选择相同的字符。

于 2012-06-08T05:53:10.047 回答
4

我对 Java 不太了解,但 URL 查询参数应该用“&”分隔,而不是“?”

https://www.rfc-editor.org/rfc/rfc3986是使用“sub-delim”作为关键字进行参考的好地方。http://en.wikipedia.org/wiki/Query_string是另一个很好的来源。

于 2012-06-08T05:49:12.590 回答
2

您可以将多个参数传递为“ ?param1=value1&param2=value2

但这并不安全。它很容易受到Cross Site Scripting (XSS) Attack.

您的参数可以简单地替换为脚本。

看看这篇文章文章

您可以使用StringEscapeUtils的 API 使其安全

static String   escapeHtml(String str) 
          Escapes the characters in a String using HTML entities.

即使https在没有上述预防措施的情况下使用 url 进行安全保护也不是一个好习惯。

看看相关的 SE 问题:

URLEncoder.encode(string, "UTF-8") 是一个糟糕的验证吗?

于 2016-03-03T00:32:11.133 回答