背景
有数据文件是存储在服务器中使用的中文名,而数据库中对应保存了这些文件对应的存储路径,我们使用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;
}
至此,问题解决