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

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

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

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

相关推荐
CC.GG6 分钟前
【C++】异常
java·jvm·c++
荒诞硬汉18 分钟前
抽象相关学习
java·学习
凸头21 分钟前
一个小问题:Swagger 不显示 VO,Swagger 泛型丢失
java
Pluchon22 分钟前
硅基计划4.0 算法 动态规划高阶
java·数据结构·算法·leetcode·深度优先·动态规划
编程彩机27 分钟前
互联网大厂Java面试:从Spring Boot到分布式缓存的技术场景解析
java·redis·分布式·缓存·大厂面试·技术解析·sprint boot
007php0071 小时前
mac笔记本中在PHP中调用Java JAR包的指南
java·ide·python·面试·职场和发展·pycharm·php
sheji34161 小时前
【开题答辩全过程】以 母婴店购物系统为例,包含答辩的问题和答案
java
哪里不会点哪里.1 小时前
Spring 中常用注解详解
java·后端·spring
草莓熊Lotso1 小时前
Qt 控件美化与交互进阶:透明度、光标、字体与 QSS 实战
android·java·开发语言·c++·人工智能·git·qt
zbguolei2 小时前
Springboot上传文件与物理删除
java·spring boot·后端