shiro从1.6.0升级到1.7.1版本,请求路径中带有中文接口报400

由于shiro1.6.0版本出现了安全漏洞,于是进行了版本的升级,升级到1.71.版本,但遇到了以下问题:

1、访问某个接口的时候,返回状态码400,invaild request;
2、访问路径为XX/XXX/{params}。XXX包含中文


找到问题所在
1、先找到是哪个地方报的400

2、看1.6.X和1.7.X版本该类的区别
1.6.X

 

1.7.X


从图片可以看出,1.6.X只校验了uri = WebUtils.toHttp(request).getRequestURI(),但是1.7.X还校验了路径 request.getPathInfo(),且进行了解码得到路径,路径中有中文,就校验不通过

 

解决办法:

创建一个自定义类

public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean {
 
    @Override
    protected FilterChainManager createFilterChainManager() {
        FilterChainManager manager = super.createFilterChainManager();
       
        Map<String, Filter> filterMap = manager.getFilters();
        Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name());
        if (invalidRequestFilter instanceof InvalidRequestFilter) {
        //此处是关键,设置false跳过URL携带中文400,servletPath中文校验
            ((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false);
        }
        return manager;
    }
}


在shiroConfig中getShiroFilterFactoryBean中引入CustomShiroFilterFactoryBean


@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager) {
        CustomShiroFilterFactoryBean shiroFilterFactoryBean =new CustomShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
 
        /*
         * 添加shiro内置过滤器,实现权限相关的url拦截
         * 常见过滤器:
         * anon:无需认证(登录)可以访问
         * authc:必须认证才可以访问
         * user:如果使用Remember Me的功能,可以直接访问
         * perms:该资源必须得到资源权限才可以访问
         * role:该资源必须得到角色权限才可以访问
         */
        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put("/add", "authc");
        filterMap.put("/update", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值