背景
有数据文件是存储在服务器中使用的中文名,而数据库中对应保存了这些文件对应的存储路径,我们使用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;
}
将过滤器添加至shiro的过滤链中
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/profile/**", "invalidRequest,authc");
filters.put("invalidRequest", invalidRequestFilter());
至此,问题解决
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。