我们已经发布了一个客户端(.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()
)?
答案 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,就好像所有内容都是嘀嗒声。