日常找Bug:java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap

在用Filter做敏感字符过滤的功能的时候,需要对下列三个方法的返回值进行功能增强:

String getParameter(String name);
String[] getParameterValues(String name); //主要是复选框
Map getParameterMap();   

第一个和第二个方法实现比较简单,在利用代理获取返回值后,对返回值进行判断,如果包含敏感字符进行替换并返回替换后的值即可。在实现第三个功能的时候,出现了java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap的错误。即在使用动态代理的时候,原map对象的值不能进行修改,必须另外new一个Map对象,然后将过滤之后的键值对添加进去,最后返回新的Map对象。

//判断方法中是否有getParameterMap
if(method.getName().equals("getParameterMap")){
    //得到返回值
    Map map = (Map)method.invoke(req,args);
    //新创建一个map集合
    Map map_new = new HashMap<>();
    //遍历集合
    for (String s : map.keySet()) {
         String[] values = map.get(s);
         //对于每组值进行遍历,如果存在敏感字符,则替换掉
         for (int i = 0; i 
      最后一点在对元素进行遍历的时候,需要使用普通遍历的方式,因为普通遍历数组可以根据数组地址,对原数组进行修改。如果使用增强for循环,则对元素的修改并不会影响原来对象的真实值。这样的话,最后返回的还是没有过滤掉的数据。

 

你可能感兴趣的:(日常找bug)