URLDecoder: Incomplete trailing escape (%) pattern问题处理

在项目中遇到分页导出Excel时抛出URLDecoder异常,通过在decode前使用replaceAll('%', '%25')修复问题。此外,当URL字符串过长导致问题时,可以改用POST方式提交,提供JS实现POST表单提交的代码片段。" 130876955,783471,华为OD考试:观看文艺汇演问题的贪心解法,"['华为OD', '算法', '编程', '开发语言', '题解']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/yangbobo1992/article/details/10076335

________________________________________________________

最近在用的项目中,分页页面在导出excel抛出

 

java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern

 

该页面采用的是DWR分页,经过一番搜罗,终于修成正果.解决办法

 大致意思都懂了,我们只需要将传入后台的参数字符在decode之前使用replaceAll('%','%25')一下即可

Java代码   收藏代码
  1. try {  
  2.      pageTitle = java.net.URLDecoder.decode(pageTitle,"UTF-8");  
  3.      sc = java.net.URLDecoder.decode(sc ,"UTF-8");   
  4. catch (UnsupportedEncodingException e) {    
  5.      e.printStackTrace();  
  6. }    

 修正后代码如下:

 

Java代码   收藏代码
  1. try {  
  2.      pageTitle = java.net.URLDecoder.decode(pageTitle.replaceAll("%", "%25"),"UTF-8");  
  3.      sc = java.net.URLDecoder.decode(sc.replaceAll("%", "%25") ,"UTF-8");   
  4. catch (UnsupportedEncodingException e) {    
  5.      e.printStackTrace();  
  6. }    

部分引用来自: http://dwr.2114559.n2.nabble.com/Exception-URLDecoder-Incomplete-trailing-escape-pattern-td5396332.html

 

特别注意:

 

有些时候导出excel时采用的是get方式导致URL字符串长度过长,改用POST方式可以解决以上问题。

 

使用js实现POST表单提交代码片段:

 

Js代码   收藏代码
  1. function post(URL, PARAMS)  
  2. {          
  3.     //创建一个临时表单  
  4.     var tempForm = document.createElement("form");       
  5.       
  6.     tempForm.action = URL;          
  7.     tempForm.method = "post";          
  8.     tempForm.style.display = "none";   
  9.       
  10.     //遍历各个参数,将文本域添加至表单中  
  11.     for (var x in PARAMS)   
  12.     {          
  13.         var opt = document.createElement("textarea");          
  14.         opt.name = x;          
  15.         opt.value = PARAMS[x];          
  16.         tempForm.appendChild(opt);          
  17.     }    
  18.       
  19.     //将表单添加至当前页面中.  
  20.     document.body.appendChild(tempForm);      
  21.       
  22.     //提交表单.  
  23.     tempForm.submit();    
  24. }  

 

也可参照此方法解决:http://blog.youkuaiyun.com/zhensoft163/article/details/7298161

转载于:https://www.cnblogs.com/cuizhf/p/4212461.html

### 解决 `request.getParameter` 出现 `URLDecoder: Illegal hex characters in escape (%) pattern` 的方法 当通过 `request.getParameter` 获取参数时,如果参数值中存在不合法的 `%` 编码模式(即不符合标准的十六进制字符),会抛出 `IllegalArgumentException` 异常。以下是解决方案及其原理。 #### 原因分析 该问题的根本原因是某些输入字符串中的 `%` 后面跟随的内容并非有效的两位十六进制数。例如: - 输入 `" %0 "` 中的 `%0` 不是一个完整的百分号编码[^1]。 - 输入 `" u9 "` 中的 `%u9` 并未遵循 URL 编码规则[^2]。 这些情况都会导致 `URLDecoder.decode()` 方法失败并抛出异常。 --- #### 解决方案 可以通过正则表达式预处理输入字符串,确保所有的 `%` 都被正确转义后再执行解码操作。具体实现如下: ```java import java.io.UnsupportedEncodingException; import java.net.URLDecoder; public class UrlDecodeExample { public static void main(String[] args) { String name = "%u9"; // 示例非法输入 if (StringUtil.isNotBlank(name)) { try { // 使用正则表达式修复非法的 % 编码 name = name.replaceAll("%(?![0-9a-fA-F]{2})", "%25"); // 执行 UTF-8 解码 name = URLDecoder.decode(name, "utf-8"); } catch (UnsupportedEncodingException e) { System.out.println("解码过程中发生异常:" + e.getMessage()); } } System.out.println("最终结果:" + name); } } ``` ##### 关键点解释 1. **正则替换** 正则表达式 `%(?![0-9a-fA-F]{2})` 表示匹配任何后面不是两个有效十六进制字符的 `%` 符号,并将其替换为 `%25`(即 `%` 自身的 URL 编码形式)。这一步可以防止后续解码过程报错[^3]。 2. **UTF-8 解码** 调用 `URLDecoder.decode()` 对经过修正后的字符串进行解码,指定字符集为 `UTF-8` 以支持国际化字符[^4]。 --- #### 注意事项 - 如果输入字符串完全不含 `%` 或者所有 `%` 已经是合法编码,则无需修改即可直接解码。 - 当无法控制前端传入的数据质量时,建议始终在服务端加入此类校验逻辑,避免运行时异常影响程序稳定性。 --- ### 示例场景扩展 假设有一个表单提交功能,允许用户上传文件名作为参数。为了兼容各种可能的非法输入,可以在接收参数后立即应用上述处理流程: ```java String fileName = request.getParameter("fileName"); if (StringUtil.isNotBlank(fileName)) { try { fileName = fileName.replaceAll("%(?![0-9a-fA-F]{2})", "%25"); fileName = URLDecoder.decode(fileName, "utf-8"); if (!fileName.contains(".")) { fileName += ".jpg"; } } catch (Exception e) { log.warn("文件名解码失败", e); } } // 继续业务逻辑... ``` 此代码片段不仅解决了潜在的解码错误,还提供了默认扩展名 `.jpg` 的附加功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值