每天一个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字符的请求,从而允许处理中文路径。

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

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

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

相关推荐
小光学长6 分钟前
基于ssm的校园约自习网站23i21xj4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring
人道领域10 分钟前
Spring拦截器原理与实战详解
java·运维·服务器
茶杯梦轩14 分钟前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端
振鹏Dong24 分钟前
ReActAgent 源码深度拆解:从调用入口到 ReAct-Loop,读懂智能体 “推理 - 行动” 范式
java·人工智能·spring·ai
QQ 313163789036 分钟前
文华财经期货指标公式大全精品套装无未来
java
前路不黑暗@1 小时前
Java项目:Java脚手架项目的模板服务和网关服务的实现(三)
java·开发语言·spring boot·git·学习·spring cloud·maven
heimeiyingwang1 小时前
向量数据库Milvus的安装部署指南
java·数据库·架构·database
马尔代夫哈哈哈1 小时前
SpringBoot 统一功能处理
java·前端·spring boot
BD_Marathon1 小时前
原型模式——Spring源码分析
java·spring·原型模式
Zachery Pole1 小时前
JAVA_06_方法
java·开发语言