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

2023-11-12

由于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;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • pytorch常见问题

    1 pytorch 的 dataloader 在读取数据时 设置了较大的 batchsize 和 num workers 然后训练一段时间报错 RuntimeError Too many open files Communication w
  • LeetCode 414. 第三大的数-C语言

    LeetCode 414 第三大的数 C语言 题目描述 解题思路 1 设置数组max 3 用于保存前三大的值 初始化为LONG MIN意为最小值 2 遍历数组对前三大的值进行更新 3 判断max 2 是否存在 若不存在直接返回max 0 代
  • 笔记本电脑切换不到投影仪 问题 解决方法

    我的笔记本是ati显卡的 在某次切换到投影仪的时候 出现问题 无法正确应用您所选择的以下设置 请更改设置并重试 外部监视器或投影仪 电视机 分辨率 颜色质量 无法正确应用您所选择的以下设置 请更改设置并重试 显示配置 解决思路 公司还有一个
  • Neo-reGeorg正向代理配合kali使用

    Neo reGeorg正向代理配合kali使用 一 Neo reGeorg介绍 在了解Neo reGeorg之前 首先应该知道大名鼎鼎的项目 https github com sensepost reGeorg 其用于开启目标服务器到本地的
  • 数据存储的随想

    文章目录 数据分布的演变 数据的使用 总结 数据分布的演变 数据分布就是一个关于数据存放在哪里的问题 数据存储的地方不是固定的 随着应用规模的扩大 为了治理的方便 会适时地调整 其中就会包括数据存储的调整 数据与应用部署在同一台设备 在早期
  • ACCESS的VBA中如何打开文件对话框并获取选中文件的路径

    在 ACCESS 的 VBA 中 可以使用 FileDialog 对象的 Show 方法来打开文件对话框 并使用 SelectedItems 属性来获取选中文件的路径 例如 Dim fd As FileDialog Set fd Appli
  • C/C++ 报错提示 “表达式必须包含类类型” 与 “不可访问”

    今天给大家分享两个常见的错误 定义对象 调用函数 时提示 表达式必须包含类类型 的报错 对象调用函数时提示 不可访问 的报错 一 表达式必须包含类类型 这种报错会出现在两种情况 类没有数据成员时 使用类定义对象时带括号了 定义类时以指针方式
  • MySQL重装——Database initialization failed错误处理

    卸载MySQL 笔者由于跟着网上的教程将MySQL安装到了C盘 忘记了可以走更改路径这条路 在卸载MySQL的路上一去不复返 试过网上诸多重装方案 大体均为以下步骤 控制面板卸载MySQL 删除注册表 删除ProgramData Appli
  • 导出文件:window.open()

    导出文件 window open globalBus emit loading const Download http window location host DI activity orderExcel actId this actId
  • Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)

    目录 ES Python客户端介绍 封装代码 测试代码 参考 ES Python客户端介绍 官方提供了两个客户端elasticsearch elasticsearch dsl pip install elasticsearch pip in
  • Flink1.13.0 + Hudi 0.11.1 + Hive2.1.1 + presto0.273.3 + yanagishima 18.0

    摘要 flink1 13 0 整合 Hudi 0 11 1 通过FlinkSQL程序 FlinkSQL命令行对Hudi的MOR及COW进行批量写 流式写 流式读取 批量读取 通过flink sql cdc flink sql kafka f
  • CSDN周赛65期简要题解

    最近几期周赛里 貌似 Python 又变成 C 站的亲儿子了 输入形式是列表还不过瘾 现在输出形式也要求是列表 而且是连一个逗号 空格 中括号都不能少的 Python 标准列表形式 虽然对 Python 来说是信手拈来 但总要考虑一下其他编
  • Node.js 使用express搭建后台服务器 ( 进阶篇 )

    上篇文章我们介绍了利用express微服务搭建简单的后台服务器以及中间件 今天我们把模块化的思想注入 利用路由分别管理 暴露API接口与前端交互等等 我们先跑起来服务 let express require express 引入expres
  • Keras深度学习资料

    https cnbeining github io deep learning with python cn 1 introduction ch1 welcome html
  • SpringBoot拦截器和动态代理有什么区别?

    在 Spring Boot 中 拦截器和动态代理都是用来实现功能增强的 所以在很多时候 有人会认为拦截器的底层是通过动态代理实现的 所以本文就来盘点一下他们两的区别 以及拦截器的底层实现 1 拦截器 拦截器 Interceptor 准确来说
  • 获取google chrome浏览器的安装位置

    今天 要获取chrome exe安装的路径 发现window XP 和 win 7 的用户路径是一样的 win7 C Users Administrator AppData Local Google Chrome Application 这
  • 2021-1-28Linux学习纪要

    linux 目录结构 bin 存放经常使用的指令 sbin 存放的是系统管理员使用的系统管理程序 home 存放普通用户的主目录 在linux中每个用户都有一个自己的目录 root 超级用户的主目录 boot 存放linux启动核心文件 包
  • 基于样本的性能分析

    基于样本的性能分析是一种性能优化技术 通过定期采集程序在运行时的信息 样本 来识别程序的热点区域或常用路径 这与基于插桩的分析相对 后者通过插入额外的代码来记录每一次函数或代码块的执行 基于样本的方法的主要优点是它对程序的性能干扰较小 但可
  • 类文件具有错误的版本号59.0应为52.0

    很笨的问题 运行 bat批处理文件的时候用管理员权限运行
  • shiro从1.6.0升级到1.7.1版本,请求路径中带有中文接口报400

    由于shiro1 6 0版本出现了安全漏洞 于是进行了版本的升级 升级到1 71 版本 但遇到了以下问题 1 访问某个接口的时候 返回状态码400 invaild request 2 访问路径为XX XXX params XXX包含中文 找