java.lang.IllegalStateException: 不允许修改锁定的参数映射

问题描述:

这个问题是在我写javaweb项目,做敏感词过滤时出现的

需求是:如果是由 getParameter(String s) 得到的数据,可以直接修改value值,将含有敏感词的部分替换为 ***

request.getParameterMap() 方法返回一个包含 HTTP 请求参数的不可修改的映射。

这样设计的主要原因是为了保护请求参数的安全性和请求的一致性。HTTP 请求参数在发送到服务器端之前已经被解析和存储起来,以供服务器端使用。如果允许修改参数值,可能会导致以下问题:

  1. 安全性问题:允许直接修改请求参数可能会导致恶意用户进行参数篡改和数据注入攻击,从而危害系统安全。

  2. 请求一致性问题:由于请求参数在多个地方会被使用,如果允许修改参数值,可能会造成请求的不一致性,导致系统无法准确处理请求。

因此,为了保持请求参数的完整性和安全性,request.getParameterMap() 方法返回的映射是不可修改的。

 

错误代码:

if (method.getName().equals("getParameterMap")){Map map = (Map) method.invoke(servletRequest, args);//通过getParameterMap获取到的map是不允许修改的if (map != null){Set set = map.keySet();for (Object o : set){String key = (String) o;String[] value = (String[]) map.get(key);//增强for一般不用来增加和删除for (String s : vocabularyList){if (value[0].contains(s)){
//                                    value[0] = value[0].replaceAll(s, "***");//这里内容没有修改,原因应该也是不允许修改参数映射value[0] = "***";map.put(key, value);//这里java.lang.IllegalStateException: 不允许修改锁定的参数映射}return map;}}}}

解决方案是:用HashMap(Map m),重新new一个map,在新的map中修改值,并返回新的map

if (method.getName().equals("getParameterMap")){Map old = (Map) method.invoke(servletRequest, args);//增强返回值Map<String, String[]> values = new HashMap(old); //获取返回值if (!values.isEmpty()){for (String key : values.keySet()){String[] value = values.get(key);for (String str : vocabularyList){if (value[0].contains(str)){ //只取String[]的第一个值value[0] = value[0].replaceAll(str, "***");values.put(key, value);}}}}return values;}

完整的代码:


@WebFilter("/*")
public class SensitiveVocabularyFilter implements Filter {private final ArrayList<String> vocabularyList = new ArrayList<String>();@Overridepublic void init(FilterConfig filterConfig) throws ServletException{BufferedReader br = null;try{//获取txt的文件位置String realPath = filterConfig.getServletContext().getRealPath("/WEB-INF/classes/敏感词汇.txt");//读取文件br = new BufferedReader(new FileReader(realPath));//将读取的每一行数据添加到vocabularyList中String line = null;while ((line = br.readLine()) != null){vocabularyList.add(line);}}catch (Exception e){e.printStackTrace();}finally{try{assert br != null;br.close();}catch (IOException e){e.printStackTrace();}}System.out.println(vocabularyList);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{//1.创建代理对象,增强getParameter方法ServletRequest proxy_request = (ServletRequest) Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable{//执行处理逻辑,增强Parameter方法if (method.getName().equals("getParameter")){//如果我取到的参数值和敏感词汇中的相同,则需要将这个值改为***String value = (String) method.invoke(servletRequest, args);//如果获取的参数不为空if (value != null){for (String vocabulary : vocabularyList){if (value.contains(vocabulary)){value = value.replaceAll(vocabulary, "***");}}return value;}}//判断方法名是否是 getParameterMap/* if (method.getName().equals("getParameterMap")){Map map = (Map) method.invoke(servletRequest, args);//通过getParameterMap获取到的map是不允许修改的if (map != null){Set set = map.keySet();for (Object o : set){String key = (String) o;String[] value = (String[]) map.get(key);//增强for一般不用来增加和删除for (String s : vocabularyList){if (value[0].contains(s)){value[0] = value[0].replaceAll(s, "***");//java.lang.IllegalStateException: 不允许修改锁定的参数映射
//                                    value[0] = "***";map.put(key, value);//这里java.lang.IllegalStateException: 不允许修改锁定的参数映射}return map;}}}}*///判断方法名是否是 getParameterMap//解决:new一个新的mapif (method.getName().equals("getParameterMap")){Map old = (Map) method.invoke(servletRequest, args);//增强返回值Map<String, String[]> values = new HashMap(old); //获取返回值if (!values.isEmpty()){for (String key : values.keySet()){String[] value = values.get(key);for (String str : vocabularyList){if (value[0].contains(str)){ //只取String[]的第一个值value[0] = value[0].replaceAll(str, "***");values.put(key, value);}}}}return values;}//判断方法名是否是 getParameterValueif (method.getName().equals("getParameterValues")){String[] value = (String[]) method.invoke(servletRequest, args);//需要把敏感词汇txt每一行的字符都搞到一个字符串数组中if (value != null){for (String str : vocabularyList){for (int i = 0; i < value.length; i++){if (value[i].contains(str)){value[i].replaceAll(str, "***");}}}}return value;}return method.invoke(servletRequest, args);}});//2.放行filterChain.doFilter(proxy_request, servletResponse);}@Overridepublic void destroy(){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1749. 任意子数组和的绝对值的最大值

诸神缄默不语-个人CSDN博文目录 力扣刷题笔记 文章目录 1. 暴力搜索2. 动态规划3. 前缀和 1. 暴力搜索 直接用2个指针从索引0开始找到最后一个索引&#xff0c;时间复杂度大概是 O ( n 2 ) O(n^2) O(n2)吧&#xff0c;总之这么搞不行&#xff0c;以下是我用Python写的一些典型…

设计模式之六:命令模式(封装调用)

命令模式可以将请求的对象和执行请求的对象解耦&#xff08;实际上是通过命令对象进行沟通&#xff0c;即解耦&#xff09;。&#xff08;个人感觉&#xff0c;这章讲的很一般&#xff09; 按个人理解来讲&#xff1a; 假如需要一个遥控器&#xff0c;遥控器有一个插口可以插上…

【JAVA】有关时间的操作在编程中如何实现?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言Date 类Date 类方法Data的缺陷实例获取当前日期时间日期比较java中设置date数据的显示格式 前言 在许多应用程序中&#xff0c;日期和时间的处理是必不可少的。Java提供了一…

【80天学习完《深入理解计算机系统》】第二天 2.2 整数的表示【有符号数,无符号数,符号数的扩展,有无符号数的转变】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

【Matlab】Elman神经网络遗传算法(Elman-GA)函数极值寻优——非线性函数求极值

往期博客&#x1f449; 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 本篇博客将主要介绍Elman神…

【数据结构】“单链表”的练习题

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Unity之ShaderGraph 节点介绍 数学节点

数学 高级Absolute&#xff08;绝对值&#xff09;Exponential&#xff08;幂&#xff09;Length&#xff08;长度&#xff09;Log&#xff08;对数&#xff09;Modulo&#xff08;余数&#xff09;Negate&#xff08;相反数&#xff09;Normalize&#xff08;标准化矢量&…

Django Rest_Framework(二)

文章目录 1. http请求响应1.1. 请求与响应1.1.1 Request1.1.1.1 常用属性1&#xff09;.data2&#xff09;.query_params3&#xff09;request._request 基本使用 1.1.2 Response1.1.2.1 构造方式1.1.2.2 response对象的属性1&#xff09;.data2&#xff09;.status_code3&…

技术应用:Docker安全性的最佳实验|聊聊工程化Docker

&#x1f525; 技术相关&#xff1a;《技术应用》 ⛺️ I Love you, like a fire! 文章目录 首先&#xff0c;使用Docker Hub控制访问其次&#xff0c;保护密钥写在最后 不可否认&#xff0c;能生存在互联网上的软件都是相互关联的&#xff0c;当我们开发一款应用程序时&#x…

Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》

一、查看可安装的版本 docker search prom/prometheus 二、拉取镜像 docker pull prom/prometheus 三、查看镜像 docker images 四、书写配置文件-以及创建挂载目录 宿主机挂载目录位置&#xff1a; 以及准备对应的挂载目录&#xff1a; /usr/local/docker/promethues/se…

字节C++后端面试总结

字节的面经,技术栈是 C++ 后端。 计算机网络 UDP和TCP区别 先说了概念一个是面向连接的基于字节流的可靠连接,一个是不需要连接的基于数据报的不可靠传输 然后说了几个小点,比如首部长度、应用场景、服务对象什么的。 补充: 还有一个很重要的点:UDP 的实时性比 TCP 好…

Kotlin基础(十一):反射和注解

前言 本文主要讲解kotlin反射和注解。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 kotlin反射 1.1.1 kotlin反射概念和常见使用场景 在Kotlin中&#xff0c;反射是一种能够在运行时动态地获取、检查和操作类、属性、方法等结构的能力。Kotlin为反射提供了一…

【多重信号分类】超分辨率测向方法——依赖于将观测空间分解为噪声子空间和源/信号子空间的方法具有高分辨率(HR)并产生准确的估计(Matlab代码实现)

【多重信号分类】超分辨率测向方法——依赖于将观测空间分解为噪声子空间和源/信号子空间的方法具有高分辨率&#xff08;HR&#xff09;并产生准确的估计&#xff08;Matlab代码实现&#xff09; &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️…

uniapp 微信小程序 echarts地图 点击显示类目

效果如图&#xff1a; 在tooltip内axisPointer内添加 label:{show:true} 即可显示“请求离婚”的标题

护网专题简单介绍

护网专题简单介绍 一、护网红蓝队介绍1.1、网络安全大事件1.2、护网行动由来1.3、护网行动中的角色二、红队介绍2.1、红队所需技能2.2、红队攻击流程 三、蓝队介绍3.1、蓝队所需技能3.2、蓝队防守四阶段3.3、蓝队前期准备 四、常见安全厂商介绍4.1、常见安全厂商 五、常见安全产…

使用罗技鼠标后 弹出当前页面的脚本发生错误AppData/Local/Temp/LogiUI/Pak/js/jquery-1.3.2.min.js解决

使用的台式机&#xff0c;没有蓝牙驱动&#xff0c;在用logi无线鼠标时&#xff0c;把鼠标连接插入台式机后弹出的如上图所示这个提示&#xff0c;无论是点是/否&#xff0c;还是X掉上图提示&#xff0c;电脑右下角的图依然存在。不习惯这丫的存在。 我重启还是有&#xff0c;然…

Linux shell yes命令(不停输出换行的y)(不停输出换行的指定字符串)(脚本自动确认y)

文章目录 yes命令功能doc文档英文中文翻译完整文档 示例应用案例自动为脚本多次确认y yes命令功能 yes命令可以不断地输出换行的指定字符串&#xff0c;不加参数时&#xff0c;不断输出换行的“y”&#xff0c;有时我们需要执行一些需要用户键入“y”确认的脚本&#xff0c;但…

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

PoseiSwap曾在前不久分别以IDO、IEO的方式推出了POSE通证&#xff0c;但PoseiSwap DEX中并未向除Zepoch节点外的角色开放POSE资产的交易。而在前不久&#xff0c;PoseiSwap推出了全新的“Poseidon”池&#xff0c;该池将向所有用户开放&#xff0c;并允许用户自由的进行质押、交…

HTML5 中新增了哪些表单元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML5 中新增了的表单元素⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

笔记:Android 9系统启动流程

启动流程 1.按下电源&#xff0c;系统启动 当电源键按下时&#xff0c;引导芯片代码&#xff08;汇编指令&#xff09;会从预定的地方&#xff08;固化在ROM&#xff09;开始执行&#xff0c;将引导程序 BootLoader 加载到 RAM中&#xff0c;然后执行 2.引导程序 BootLoader …