每天一个BUG--记一个GET请求携带中文路径遇到@PathVariable注解,接口响应400的故事

在做公司产品定制化开发的时候,发现一个页面会提示"请求无效"的报错,F12看下,长下边这样

我把请求复制一下 http://192.168.12.120:8443/cms/user/%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7/lock/status?t=1701745001795

地址中%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7,这个是URL编码后的 "测试用户"。这看起来是一个正经的URL。

然后让我们看一下后端的接口怎么接收的(好像也没必要看了)

less 复制代码
/**
  * <p>@description :获取用户锁定状态</p>
  * <p>@version :0.1</p>
  * <p>@Time :2018-07-16</p>
  * <p>@param gpUser
  * <p>@return </p>
 */
@LogWrite(modelName="用户",desc="获取用户锁定状态",option=OpType.GET)
@RequestMapping(value="/{username}/lock/status",method=RequestMethod.GET)
public Result lockStatus(@PathVariable("username")String name,HttpServletRequest request){
    ...
}

忽略这个注释=-=

接口取得参数就是用户列表中的用户名,本身用作登录的用户名一般都是数字+字母的组合,用这个接口其实没啥问题。碰巧人家从产品层面支持登录的用户名为中文,嘿嘿,想不报错都难。

下一步就改吧改吧

less 复制代码
/**
  * <p>@description :获取用户锁定状态</p>
  * <p>@Time :2018-07-16</p>
  * <p>@param gpUser
  * <p>@return </p>
 */
@LogWrite(modelName="用户",desc="获取用户锁定状态",option=OpType.GET)
@RequestMapping(value="/lock/status",method=RequestMethod.GET)
public Result lockStatus (@RequestParam("username") String name){

这样就不报错了,机灵的很,顺便去看了下最新产品的代码,也是这么改的,不过这算是存在了许久的bug了吧!

不过我又查到了一个shiro相关的配置,好像也可以解决一些问题

java 复制代码
@Bean
public InvalidRequestFilter invalidRequestFilter(){
   InvalidRequestFilter invalidRequestFilter = new InvalidRequestFilter();
   invalidRequestFilter.setBlockNonAscii(false);
   return invalidRequestFilter;
}

通过配置 InvalidRequestFilter 并设置 setBlockNonAscii(false) 来解决中文路径的问题是一个有效的方法。这个配置告诉 Shiro 不要拦截包含非ASCII字符的请求,从而允许处理中文路径。

这种方式也是一种解决方案,特别是当应用中有自定义的请求处理过滤器时,可以通过配置来定制请求的处理流程。不过这种解决方案也可能会带来一些安全风险,因为在某些情况下,可能存在对特殊字符的攻击。

需要应用程序对中文路径和其他特殊字符进行了适当的验证和处理,以防止潜在的安全漏洞。需要对其中的潜在风险有清晰的认识,然后再考虑采用这种方案。

不过我对关闭拦截所带来的其他问题没啥太大的概念,所以还是保守修改,修改接收参数的方式吧=-= 如果有好心人能大概补充下修改过滤器会不会带来些其他问题就更好了,蹲一个好心人。

相关推荐
计算机小白一个37 分钟前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
sunburn-2 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
vx-程序开发2 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
zzh___zzh3 小时前
SQL 窗口函数 ROW_NUMBER、RANK、DENSE_RANK 常用方法笔记
java
计科土狗3 小时前
GESP六级专题之类与对象
java·前端·数据库
Slow菜鸟4 小时前
第3篇:实操落地篇 · 3套企业标准工作流(IDEA可视化版)
java·ide·intellij-idea
weixin_440784114 小时前
Java基础常见题
java·开发语言·python·java基础
掉鱼的猫4 小时前
Hot-Plug 实战:运行期管理 Solon 插件
java·hotfix
markinmarkin4 小时前
Spring 中有哪些方式可以把Bean 注入到IOC 容器?
java·spring
带刺的坐椅5 小时前
Hot-Plug 实战:运行期管理 Solon 插件
java·solon·插件·热插拔