0

我正在尝试找到解决我正在帮助支持的网络应用程序中设计缺陷的最佳方法。服务的一部分将参数(“myparam”)传递给 .jsp 页面,该页面又调用 REST 服务,包括我们的 myparam 作为路径参数。设计缺陷在于 myparam 应该作为表单参数传递,因为它可以是自由文本。但是,我们无法更改实现,因为 .jsp 最终涉及到其他方。

我的解决方案是使用十六进制编码对 myparam 进行编码(单独的 url 编码不起作用,因为你最终会得到“%”等,REST 的 org.restlet 实现不喜欢在路径参数中看到)。使用 Apache 编解码器库,我有这样的东西:

选项 1(仅十六进制):

String decodedParam = new String(Hex.decodeHex(myparam.toCharArray()));

这符合我们的目的。我真正想做的是结合 URL 和 Hex 编码,这样我就可以真正涵盖所有可能性:

选项 2(十六进制 + url 解码):

参数准备:

String workText = URLEncoder.encode(inText, encoding); // a
char[] encodedBytes = Hex.encodeHex(workText.getBytes()); // b
String myparam = new String(encodedBytes);

解码(REST):

String decodedParam = new String(Hex.decodeHex(myparam.toCharArray())); // c
String doubleDecodedParam = URLDecoder.decode(decodedParam, "UTF-8"); // d

我有两个问题:

  1. 为什么第二个选项不起作用?(每当我尝试在 d 处对我的字符串进行 URL 解码时)我得到一个 java.lang.IllegalArgumentException)。我已经在http://ostermiller.org/calc/encode.html测试了我的参数值的双重编码和解码,没有问题。

  2. 有没有更好的方法用 REST 对路径参数进行编码?

4

1 回答 1

1

在上面关于字符集的代码中,有一堆对我来说不太合适的东西。在编码步骤中,您假设无论 Hex 类做什么(哪个框架来自哪个框架?)正在返回字节,这些字节可以在您的 JVM 正在运行的编码中解释为字符串。我想如果Hex.encodeHex()支持合同这可行它。

然后是另一边。首先,您使用 UTF-8 解码十六进制字符串。您已经默默地假设您的 JVM 在 UTF-8 中运行,因为您正在传递 a 的结果new String(),它假设来自 Hex.decodeHex() 的 char 数组处于 JVM 当前运行的编码中,这可以如果您要这样解码,则只能是 UTF-8。我也没有看到那个 URL 编码传递的意义。似乎它完全是多余的。

我想这些都不是真正的核心问题。中间JSP 中究竟发生了什么还有另一个问题。它可能会解码它得到的任何东西并重新编码。这应该是透明的,但我不确定你在这个数据中的水平。如果您在将其解码为参数之前看到它,则可能会导致错误的解释。

于 2009-09-28T10:03:29.970 回答