`
zydky
  • 浏览: 85413 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

关于request.getParameterMap()返回的map对象——我的一次移植测试经历

阅读更多
    某次在伙伴处进行移植测试,他们写了一个过滤类FirstFilter.java,目的是实现对request请求参数中的敏感字符进行过滤提示,然后让请求继续进行,FirstFilter.java部分代码如下:

Map map = request.getParameterMap();
Set set = map.entrySet();
if (map != null) {
  for (Iterator it = set.iterator(); it.hasNext();) {
  Map.Entry entry = (Entry) it.next();
				
  //System.out.println("entry class name:" + entry.getClass().getName());
				
  if (entry.getValue() instanceof String[]) {
    String[] values = (String[]) entry.getValue();
      for (int i = 0; i < values.length; i++){
      values[i] = values[i].replace("'", "''");
      for (int j = 0; j < value_group.length; j++){
        if(values[i].equalsIgnoreCase(value_group[j])){
          System.out.println("有关键字");
        }
      }
    }
    entry.setValue(values);
  }
			}
}


    tomcat服务器下代码正常,在apusic应用服务器下报UnsupportedOperationException异常,提示Map.Entry不支持setValue()方法,异常堆栈信息如下:

2009-09-18 11:08:53 错误 [apusic.web.cangzhouOA./cangzhouOA] 执行Servlet时发生错误。
java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry.setValue(Collections.java:1434)
	at com.OA.filter.FirstFilter.doFilter(FirstFilter.java:77)
	at com.apusic.web.container.FilterComponent.doFilter(Unknown Source)
	at com.apusic.web.container.FilterChainImpl.performFilter(Unknown Source)
	at com.apusic.web.container.WebContainer.invoke(Unknown Source)
	at com.apusic.web.container.WebContainer.processRequest(Unknown Source)
	at com.apusic.web.http.VirtualHost.processRequest(Unknown Source)
	at com.apusic.web.http.HttpServer.processRequest(Unknown Source)
	at com.apusic.web.http.HttpConnectionHandler.service(Unknown Source)
	at com.apusic.web.http.ConnectionHandler.processRequest(Unknown Source)
	at com.apusic.web.http.ConnectionHandler.processConnection(Unknown Source)
	at com.apusic.web.http.ConnectionHandler.run(Unknown Source)
	at com.apusic.util.ThreadPoolImpl$WorkerThread.run(Unknown Source)


    我在他们代码中加入

System.out.println("entry class name:" + entry.getClass().getName());

在控制台打出Map.Entry类变量的具体实现类,在tomcat下打出:entry class name:java.util.HashMap$Entry

    在apusic下打出:entry class name:java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry

    我注意到JDK API文档中,Map.Entry类中setValue()方法是可选操作(optional operation),setValue()本身也声明会抛出UnsupportedOperationException,我的理解是sun的规范允许对这个方法不进行实现。问题出现原因应该是tomcat下允许Map.Entry进行重新赋值,而我们服务器不允许。

    后来经跟同事沟通,研究了servlet规范,确定这个异常之所以会抛出来,是因为客户的程序中试图去修改ServletReqest中getParameterMap()方法返回的Map引起的,根据java ee servlet2.5规范要求,ServletRequest.getParameterMap()需返回一个immutable(不可改变)的java.util.Map实现,tomcat在这方面没有严格遵照规范,而apusic严格遵照规范,所以导致抛出异常。后来在weblogic下进行测试,weblogic也抛出异常。

JavaEE规范之所以这样要求,是出于“安全因素”的考虑。规范描述如下:

public java.util.Map getParameterMap()

Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.

Returns: an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.
分享到:
评论
3 楼 zydky 2012-06-01  
kkliuxiang 写道
请问您最后怎么解决的,我跟你一样过滤特殊字符的时候出现问题了,问题我也找到,但就是没找到解决方法。

呵呵,好久没上来了,看到有人问怎么解决的,当时我们是给apusic打了个补丁包,放松了对规范的遵循,允许修改parameterMap
2 楼 kkliuxiang 2012-02-16  
请问您最后怎么解决的,我跟你一样过滤特殊字符的时候出现问题了,问题我也找到,但就是没找到解决方法。
1 楼 zzhangqqiang 2010-04-14  
这个问题最后如何解决的呢

相关推荐

    request.getParameterMap()返回的是String []数组1

    getParameter()获得的是String类型,多个参数名相同默认获取第一个getParameterValues()获得的是数组,多个参数名相同时,值在同

    java修改请求参数

    可以动态修改表达提交参数,使之修改request.getParameterMap(),不报异常。

    java request.getParameter中文乱码解决方法

    今天跟大家分享几个解决java Web开发中,request.getParameter()获取URL中文参数乱码的解决办法,需要的朋友可以参考下

    根据数据库表自动产生javabean

    public class ObjectUtil { //public static Object request2Obj(HttpServletRequest ... public static Map, Object&gt; request2Map(HttpServletRequest request) { return request.getParameterMap(); } }

    window.open 函数的操作

    window.open 函数的操作 取出showModalDialog中传过来的数据对象 request.getParameterMap()相关的操作实例

    作业getParameterMap()

    作业getParameterMap()的显示

    pageDate封装参数,不用实体类

    Map properties = request.getParameterMap(); Map returnMap = new HashMap(); Iterator entries = properties.entrySet().iterator(); Entry entry; String name = ""; String value = ""; while ...

    servlet2.4doc

    The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain. doGet...

    springmybatis

    创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` ...

    阿里云java短信验证码源码-tianjin_travel:黑马旅游网项目练习

    阿里云java短信验证码源码 黑马旅游网(web阶段...request.getParameterMap(); // 2.封装到User实体 new User(); // 3.调用service注册 userService.register(user); // 4.判断 if (getSuccess()) { // 注册成功 send

    reqresp_demo 2.zip

    请求对象 request 和响应对象 response(5)_request 的 getParameterMap 方法详解

    Struts2属性文件详解

    对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题.该属性的默认值是false.对于 WebLogic、Orion和OC4J服务器,通常应该设置该属性为true. struts....

    Struts2\constant应用

    对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。 对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。 ...

    潇湘jsp多文件上传组件2.2

    由于最近几天正好用到上传组件,所以在网上找到了潇湘jsp多文件上传组件2.1版本,经测试,发现如下问题:页面编码为UTF-8时,getParameter()的值乱码;另外没有getParameterMap()方法。所以修改完善了这两个功能,...

    j2ee中表单传值的所有方法

    j2ee利用getParameter()、getParameterValues()、getParameterMap()和getParameerNames()这些方法获得表单的传值!

Global site tag (gtag.js) - Google Analytics