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

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

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

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

相关推荐
晨曦中的暮雨42 分钟前
Golang速通(Javaer版)
java·开发语言·后端·golang
七老板的blog1 小时前
当 Spring StateMachine 遇见大模型:构建工业级 AI 写作流水线
java·人工智能·spring
云烟成雨TD1 小时前
Spring AI 1.x 系列【46】MCP Security 模块
java·人工智能·spring
CRMEB系统商城1 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php
sinat_255487811 小时前
第七部分。介绍MVC(模型-视图-控制器)模式
java·ide·http·tomcat·intellij-idea
李白的天不白2 小时前
ps -ef | grep java
java
ab_dg_dp2 小时前
Android 17+ 提取 AIDL 生成 Java 文件的实用脚本
android·java·python
超哥--2 小时前
B站视频内容智能分析系统(三):B站视频自动采集
java·开发语言·音视频·ai编程
郑洁文2 小时前
基于SpringBoot的商品仓库管理系统的设计与实现
java·spring boot·后端·仓库管理系统·商品仓库管理系统
布朗克1682 小时前
22 异常处理——从入门到精通的完整指南
java·异常处理