如果收到的HTTP请求参数(URL中的GET请求)中有一个字符串,是中文,比如“10%是黄段子”,服务器段使用URLDecoder.decode就会出现此异常。URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。如果内容中存在中文,必须要进行编解码。“10%是黄段子”转码过后是“10%25%E6%98%AF%E9%BB%84%E6%AE%B5%E5%AD%90%”被用来作为转义字符使用。

  上面的字符串中'%'是一个中文字符'是',而转换的实现是将%后面的两个字符一起转为一个16进制数。拿"%是"来转换数字,肯定会有NumberFormatException异常。

  类似的如果请求字符串中有'+',也会有问题。因为'+'被当做空格使用了。一个解决办法就是将%替换为%25。

public static String replacer(StringBuffer outBuffer) {
String data = outBuffer.toString();
try {
data = data.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
data = data.replaceAll("\\+", "%2B");
data = URLDecoder.decode(data, "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return data;
}

这里使用了一个特殊正则表达式:零宽负向先行断言(zero-widthnegative lookahead assertion),模式为(?!pattern),代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。%(?![0-9a-fA-F]{2})意思是'%'开始,但是后面两个字符不是数字,也不是字母。

或者使用POST请求,将参数参加到body中而不是请求url拼接

最新文章

  1. java8日期时间
  2. table 相关
  3. html5 弹框 可用于安卓手机弹出输入框
  4. 【Hello CC.NET】自动化发布时 Web.config 文件维护
  5. git pull/push项目的时候总是提示要输入用户名密码的解决方案
  6. javascript 时间倒计时
  7. Android 多线程 异步加载
  8. 性能测试培训:帮你定位 Linux 性能问题的 18 个命令以及工具
  9. 重温《STL源码剖析》笔记 第一章
  10. python 3.6.5 hashlib 和 hmac 模块
  11. 企业BI系统应用的切入点及五大策略
  12. c++/ boost 库常见错误及解决方法总结
  13. 排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))
  14. easyui使用介绍
  15. LeetCode 192. Word Frequency
  16. IDL返回众数(数组中出现次数最多的值)
  17. springboot--数据库操作
  18. 日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)
  19. iNeuOS云操作系统,.NET Core全系打造
  20. ScrollPic.js——图片左右滚动插件

热门文章

  1. ROW/COW 快照技术原理解析
  2. Delphi XE2 之 FireMonkey 入门(5) - TAlphaColor
  3. Delphi XE2 之 FireMonkey 入门(3) - 关于 TPosition
  4. Monte Carlo Policy Evaluation
  5. [开发技巧]·如何让离线安装Python包
  6. 整理那些用于基本生存的shell命令
  7. jmeter分布式压测 java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
  8. [Web 前端] 015 css 三种元素的介绍
  9. hdu-4292.food(类dining网络流建图)
  10. 关于Python学习的一点说明