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

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

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

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

相关推荐
日月星辰Ace31 分钟前
jwk-set-uri
java·后端
xiao--xin1 小时前
LeetCode100之二叉搜索树中第K小的元素(230)--Java
java·算法·leetcode·二叉树·树的统一迭代法
钢板兽1 小时前
Java后端高频面经——Spring、SpringBoot、MyBatis
java·开发语言·spring boot·spring·面试·mybatis
钢板兽1 小时前
Java后端高频面经——JVM、Linux、Git、Docker
java·linux·jvm·git·后端·docker·面试
awonw1 小时前
[java][基础] 悲观锁 vs 乐观锁
java·开发语言
嘵奇1 小时前
10个实用IntelliJ IDEA插件
java·ide·intellij-idea
Trouvaille ~1 小时前
【Java篇】数据类型与变量:窥见程序的天地万象
java·开发语言·青少年编程·面向对象·数据类型·基础知识·入门必看
A仔不会笑2 小时前
MySQL面试篇——性能优化
java·数据库·mysql·面试·性能优化
用户53866168248222 小时前
SpringBoot 业务中 通过嵌套异步的方式 提高业务表数据同步效率
java·spring boot
MickeyCV2 小时前
《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)
java·spring boot·后端·苍穹外卖