2009-09-28 107 views
0

我正在尝试寻找绕过我帮助支持的Web应用程序设计缺陷的最佳方法。服务的一部分将参数(“myparam”)传递给.jsp页面,该页面又调用REST服务,其中包括我们的myparam作为路径参数。设计缺陷是myparam应该作为表单参数传递,因为它可以是自由文本。但是,我们无法改变实现,因为其他方都参与了.jsp事情。编码/解码REST路径参数

我的解决办法是使用编码十六进制编码(URL编码单独为你结束了“%”等,其中org.restlet实现REST的不喜欢的路径参数看不工作)的myparam。使用Apache的编解码器库,我有这样的事情:

选项1(只十六进制):

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

这适用于我们的目的。我真正想要做的是URL-和十六进制编码结合起来,这样我就可以真正覆盖所有posibilities:

选项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. 为什么第二个选项不起作用? (每当我尝试和URL解码我的字符串在D)我得到一个java.lang.IllegalArgumentException)。我已经在http://ostermiller.org/calc/encode.html上测试了我的参数值的双重编码和解码,没有问题。

  2. 有没有更好的方式来编码路径参数与REST?

+0

1.您在哪里得到IllegalArgumentException?任何堆栈跟踪?至少是抛出异常的地方? – 2009-09-28 07:55:24

回答

1

在上面关于字符集的代码中,有一堆东西看起来不太合适。在编码步骤中,假设无论Hex类是什么(哪个框架是来自哪个框架),都会返回字节,可以在您的JVM运行的编码中将其解释为字符串。我想这适用于Hex.encodeHex()支持它。

然后还有另一面。首先,您使用UTF-8解码十六进制字符串。你默默地认为你的JVM是以UTF-8运行的,因为你传递的结果是new String(),它假定来自Hex.decodeHex()的char数组处于JVM当前正在运行的编码中,如果您正在解码,则只能是UTF-8。我也没有看到那个URL编码通过的地方。看起来它完全是多余的。

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

+0

感谢您的意见,wds。我的问题是,我重新在ostermiller网站上提供了一些示例字符串,然后我在REST界面中进行了测试:未检查正在使用的编码。更严格的测试表明,双重编码工作(测试字符串 - > URL编码 - >十六进制编码,然后再回来),但你是对的:中间发生的是一个黑盒子。由于这些参数是带有一些其他允许字符(“#”,“,”等)的电子邮件地址,我已经使用了Hex编码。 – davek 2009-09-29 11:13:10