java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

 更新时间:2017年03月21日 10:24:08   作者:digdeep  
这篇文章主要给大家介绍了关于java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

最近在使用 url 的 queryString 传递参数时,因为参数的值,被DES加密了,而加密得到的是 Base64的编码字符串

类似于:

za4T8MHB/6mhmYgXB7IntyyOUL7Cl++0jv5rFxAIFVji8GDrcf+k8g==

显然 这里面含有了 特殊字符: / + = 等等,如果直接通过url 来传递该参数:

url = "xxxxx?param=" + "za4T8MHB/6mhmYgXB7IntyyOUL7Cl++0jv5rFxAIFVji8GDrcf+k8g==";

那么在服务端获得 param 会变成类似于下面的值:

"za4T8MHB/6mhmYgXB7IntyyOUL7Cl 0jv5rFxAIFVji8GDrcf k8g=="

我们看到 三个 + 号消失了。

其原因就是:如果url参数值含有特殊字符时,需要使用 url 编码。

url = "xxxxx?param=" + URLEncoder.encode("xxx", "utf-8");

然后服务端获取时:

String param = URLDecoder.decode(param, "utf-8");

这样才能获得正确的值: "za4T8MHB/6mhmYgXB7IntyyOUL7Cl++0jv5rFxAIFVji8GDrcf+k8g=="

其实 js 中也有类似功能的函数:

参见:js中编码函数:escape,encodeURI,encodeURIComponent

注意事项:

URLEncoder should be the way to go. You only need to keep in mind to encode only the individual query string parameter name and/or value, not the entire URL, for sure not the query string parameter separator character & nor the parameter name-value separator character =

String q = "random word 拢500 bank $";
String url = "http://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");

URLEncoder 必须 仅仅 编码 参数 或者参数的值,不能编码整个 url,也不能一起对 param=value 进行编码。而是应该: param=URLEncode(value, "utf-8")

或者 URLEncode(param, "utf-8")=URLEncode(value, "utf-8")

因为 url 中的 & 和 = 他们是作为参数之间 以及 参数和值之间的分隔符的。如果一起编码了,就无法区分他们了。

进一步参考文档:

https://www.talisman.org/~erlkonig/misc/lunatech%5Ewhat-every-webdev-must-know-about-url-encoding/

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • JAVA基于Slack实现异常日志报警详解

    JAVA基于Slack实现异常日志报警详解

    这篇文章主要为大家介绍了JAVA基于Slack实现异常日志报警详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java中File类方法详解以及实践

    Java中File类方法详解以及实践

    Java File类的功能非常强大,利用java基本上可以对文件进行所有操作,下面这篇文章主要给大家介绍了关于Java中File类方法以及实践的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 通过MyBatis读取数据库数据并提供rest接口访问

    通过MyBatis读取数据库数据并提供rest接口访问

    这篇文章主要介绍了通过MyBatis读取数据库数据并提供rest接口访问 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • Java静态方法不能调用非静态成员的原因分析

    Java静态方法不能调用非静态成员的原因分析

    在Java中,静态方法是属于类的方法,而不是属于对象的方法,它可以通过类名直接调用,无需创建对象实例,非静态成员指的是类的实例变量和实例方法,它们需要通过对象实例才能访问和调用,本文小编将和大家一起探讨Java静态方法为什么不能调用非静态成员
    2023-10-10
  • 基于java中泛型的总结分析

    基于java中泛型的总结分析

    本篇文章介绍了,在java中泛型的总结分析。需要的朋友参考下
    2013-05-05
  • Java利用POI读取、写入Excel的方法指南

    Java利用POI读取、写入Excel的方法指南

    这篇文章主要给大家介绍了关于Java利用POI读取、写入Excel的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Mybatis的Cursor避免OOM异常的方法详解

    Mybatis的Cursor避免OOM异常的方法详解

    在Mybatis中,有一个特殊的对象Cursor,这个对象的注释上清晰的说明了,这个类的用途,在Mybatis中使用Cursor非常简单,只要在Mapper文件中将方法的返回值设置成Cursor<T>即可,本文给大家介绍了Mybatis的Cursor避免OOM异常的方法,需要的朋友可以参考下
    2024-06-06
  • Java中的泛型

    Java中的泛型

    这篇文章主要介绍为何要泛型,如何使用泛型,自定义泛型的方法,泛型类的子类等多方面介绍了JAVA中的泛型,需要的小伙伴请看下文
    2021-08-08
  • Java中CAS机制实现方法详解

    Java中CAS机制实现方法详解

    传统的并发控制手段如synchronized和ReentrantLock虽有效防止资源竞争,却可能引起性能开销,相比之下,CAS(CompareAndSwap)提供一种轻量级的乐观锁策略,通过硬件级别的原子指令实现无锁并发,提高性能,需要的朋友可以参考下
    2024-09-09
  • 如何使用 Shell 脚本查看多个服务器的端口是否打开的方法

    如何使用 Shell 脚本查看多个服务器的端口是否打开的方法

    这篇文章主要介绍了如何使用 Shell 脚本来查看多个服务器的端口是否打开的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论