【问题标题】:How should a GWT encoded query parameter be decoded server side?应该如何在服务器端解码 GWT 编码的查询参数?
【发布时间】:2011-08-31 08:37:04
【问题描述】:

我正在使用 GWT 的 com.google.gwt.http.client.URL.encode() 方法对查询参数进行编码,但发现我无法在服务器上使用 URL.decode() 对其进行解码,因为实现不可用(我怀疑它使用 javascript 客户端实现)。我明白了……

java.lang.UnsatisfiedLinkError: com.google.gwt.http.client.URL.decodeImpl(Ljava/lang/String;)Ljava/lang/String;

有人可以建议我应该使用服务器端来解码编码字符串吗?

【问题讨论】:

  • 我有同样的问题 - 我编写的一个类将参数解码作为其功能的一部分,并且我已将参数存储在我的数据库中。后来,在服务器端,我试图创建一个从这些参数中提取的对象——它在客户端完美地工作。我宁愿避免重写已经完美运行的课程......仍在寻求答案。

标签: url gwt encode


【解决方案1】:

我这样解决了我的问题:在客户端,我使用 com.google.gwt.http.client.URL.encodeQueryString() 对参数进行编码,例如:

URL.encodeQueryString(param)

在服务器端,我使用 ServletRequest 方法获取参数,例如:

String myParam = req.getParameter("myparam");

PS 我最初 +1'd Riley Lark 的回答,但后来我也遇到了一些字符的问题......让 ServletRequest 完成这项工作将为您处理所有字符的编码。 见Decoding international chars in AppEngine

【讨论】:

    【解决方案2】:

    java.net.URLDecoder 在 AppEngine 上实现,与 com.google.gwt.http.client.URL.encode() 完美配合。

    【讨论】:

    • com.google.gwt.http.client.URL.encode() 无法正常工作。我知道它不编码百分比符号的事实。我不相信它可以与不相关的 java.net.URLDecoder 一起使用,所以我使用了一些在客户端和服务器上都可用的自制通用编码/解码功能。
    • 您问过可以使用 URL.encode() 做什么,而 URLDecoder 就是答案。我认为您应该接受这个答案作为最直接的答案。顺便说一句,URL.encode() 是使用浏览器的 encodeURI javascript 实现实现的,至少在我在 Chrome 和 Firefox 中的测试中,% 字符被编码为%25。
    • 抱歉 - 您的解决方案对我不起作用。这两种实现在我的测试中不兼容。
    【解决方案3】:

    如果您不愿意使用 gwt-rpc,您可以使用 Base64 进行编码/解码。检查 this link 以获得 Base64 编码器/解码器的 gwt 实现。那么你所要做的就是在将请求发送到服务器之前 Base64.encode(yourParameterValue) 和在收到请求后立即在后端进行 Base64.decode(request.getParameter(yourParameterName)) 。

    干杯!

    【讨论】:

    • 你好,不是我不愿意使用gwt-rpc。当然,我在我的应用程序中到处都在使用它。在这种情况下,我编写了一些功能,允许用户从服务器请求文件,该文件以适当的 mime 类型等形式交付......我需要在请求中传递查询参数。感谢 Base64 编码器提示!我们最终编写了自己的通用编码/解码功能,因为 GWT 编码不能正常工作(它不能编码百分号!)并且不能保证它与 java URLDecode 等效(静音点,因为它无论如何都坏了) !)
    • 不确定将自己的 [de]coder 开发为 Base64 是否是个好主意,它与许多 RFC 一致(实际上它是在 RFC 4648 - en.wikipedia.org/wiki/Base64#RFC_4648 上定义的),但遗憾的是没有实现在 GWT 中(不在 2.0.3 AFAIK 中)。我们一直在所有不是 gwt-rpc 的请求中使用 Base64 [解码器] 编码器,到目前为止它们运行良好。
    • 更安全的选择是编写自己的代码来尝试混合使用两种完全不同的实现! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多