服务器端修复接收包含'&'的字符串(&符号)

时间:2012-03-07 11:27:05

标签: java servlets url-encoding

我们已经发布了一个客户端(.NET WinForms)应用程序,它将客户数据发送到Java服务器。我们在服务器端接受了大多数客户端发送的数据,但由于客户端发送了&个字符,因此会删除一些记录,因为客户端发送原始&并且没有对其进行URL编码,我们有使用以下代码修复它:

string dataBefore="A & B";
string dataBefore = System.Web.HttpUtility.UrlEncode(dataBefore);

我们无法更新所有客户端应用程序(已经发货),我们正在考虑服务器端修复。

在Fiddler的帮助下,我们已确保数据已完全离开客户端,但当服务器显示如下:

//in java
String dataReceied=request.getParameter("data");

如果数据包含&

,则会被截断

有人可以帮我们建议服务器端(java)修复吗?是否可以在java中访问请求流(而不是request.getParameter())?

2 个答案:

答案 0 :(得分:0)

它被截断,因为& 在请求中表示一个新的URL参数,如下所示: google.com?query=java&page=2。 Java将所有这些参数转换为Map,这就是它出错的地方。

您是否尝试过迭代request.getParameterMap()?其余数据很可能是下一个参数的名称。如果这不起作用,请查看HTTP the API HTTPServletRequest以查看是否有其他方式来获取您的数据。

祝你好运!

PS你在实习生写的那个人有多生气运送那个客户?这听起来搞砸了!

答案 1 :(得分:0)

您可以使用HttpServletRequest.getQueryString()javadoc)访问原始查询字符串,其中包含:

  

返回包含查询字符串的String;如果URL不包含查询字符串,则返回null。 容器不会解码该值

您可以对该字符串执行手动解码,而不是使用getParameter()

@ Wesley使用getParameterMap()的想法可能没有用,因为您不知道参数的提供顺序。

我建议将此逻辑实现为servlet过滤器,以便将破坏的参数的修复与实际的servlet逻辑分离。这将涉及编写HttpServletRequestWrapper的自定义子类,它覆盖getParameter()并手动解码查询字符串。然后,您的servlet将能够使用HttpServletrequest API,就好像所有内容都是嘀嗒声。