背景

有数据文件是存储在服务器中使用的中文名,而数据库中对应保存了这些文件对应的存储路径,我们使用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());

至此,问题解决


独上兰舟
119 声望5 粉丝

路漫漫其修远兮,吾将上下而求索。