背景
有数据文件是存储在服务器中应用的中文名,而数据库中对应保留了这些文件对应的存储门路,咱们应用 SpringBoot 的动态资源映射时默认会被 shiro 拦挡,并且有的状况下咱们也须要对文件的拜访进行认证权限拦挡。所以咱们的拜访的门路是会通过 shiro 的拦挡,而 shiro1.7 之后的版本对中文门路都进行了非法拦挡,因此中文门路会报 400 异样。
源码剖析
InvalidRequestFilter
这是一个 Shiro 在 springboot 中默认配置的全局过滤器,作用是拦挡过滤非法字符的 Url,这个过滤器会间接把中文字符是为非法,从而拦挡申请,返回错误代码 400。
解决方案
鉴于背景与源码剖析,晓得是因为 shiro 降级 1.7 之后 InvalidRequestFilter 对中文门路进行了非法校验,而起关键作用的属性为 blockNonAscii,因而咱们在 SpringBoot 中注入 shiro 框架的时候从新定义 InvalidRequestFilter 并将 blockNonAscii 设置为 false
@Bean
public InvalidRequestFilter invalidRequestFilter(){InvalidRequestFilter invalidRequestFilter = new InvalidRequestFilter();
invalidRequestFilter.setBlockNonAscii(false);
return invalidRequestFilter;
}
至此,问题解决