某次在伙伴处进行移植测试,他们写了一个过滤类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.
分享到:
相关推荐
首先,`request.getParameterMap()`方法返回的是一个`Map, String[]>`对象。这个映射中的键是参数名,值是一个`String`数组,代表该参数的所有值。当请求中有多个相同的参数名时,`getParameterMap()`会将这些参数的...
java request.getParameter中文乱码解决方法 在 Java Web 开发中,request.getParameter() 获取 URL 中文参数乱码是非常常见的问题。今天,我们将分享几个解决中文乱码的方法,以便大家可以参考。 问题分析 在 ...
`getParameterMap()`返回一个`Map, String[]>`,其中键是参数名,值是该参数的所有值(因为同一个参数名可能对应多个值)。 然而,需要注意的是,`HttpServletRequest`对象通常是只读的,直接修改`getParameterMap...
`getParameterMap()`方法返回的是一个`Map`对象,其中键是参数名,值是一个字符串数组,包含了对应参数的所有值。这是因为一个参数名可能对应多个值,例如在多选框或者复选框中,用户可以选中多个选项,这些选项会被...
4. Map,String[]> getParameterMap():取得一个请求参数的 Map。 除此之外,request 对象还提供了其他常用方法,例如: 1. void setCharacterEncoding(String encoding):设定编码格式,用来解决中文乱码问题(只...
在Web开发中,获取客户端传递给服务器的数据是一种常见需求,通常使用`request.getParameter()`方法从`HttpServletRequest`对象中获取表单数据或者URL参数。然而,在实际应用中,开发者有时会遇到`request....
- `getParameterMap()`:返回一个`Map`,键是参数名,值是对应的参数值列表(如果参数有多个值,列表长度可能超过1)。 2. **处理表单数据**: - 当用户通过HTML表单提交数据时,Request对象同样能处理这些数据。...
Request对象封装了客户端发送到服务器的所有数据,包括URL参数、请求头、请求体等。在某些场景下,可能需要对这些参数信息进行修改,比如安全过滤、数据校验或者日志记录等。本程序就是针对这种情况设计的一个实用...
`getParameterMap()`则返回一个`java.util.Map, String[]>`,其中键是参数名,值是参数值数组。这是因为同一个参数名可能对应多个值,比如在多选框中。例如: ```java Map, String[]> parameterMap = request....
但是,这个方法返回的是一个 Map, String[]> 对象,而不是我们想要的简单的 Map, String> 类型。所以,我们需要手动进行转换。 二、使用 @RequestParam 解决问题 使用 @RequestParam 注解可以将请求参数转换为 map...
* Map getParameters() : 类似于 request.getParameterMap() 方法 * Map getApplication() : 返回 Map 对象,模拟 ServletContext 实例 * Map getSession() : 返回 Map 对象,模拟 HttpSession 实例 * void set...
public class ObjectUtil { //public static Object request2Obj(HttpServletRequest ... public static Map, Object> request2Map(HttpServletRequest request) { return request.getParameterMap(); } }
本篇内容详细介绍了 `window.open` 函数的基本用法及其在实际开发中的应用场景,同时探讨了如何从 `showModalDialog` 中获取数据对象的方法,以及 `request.getParameterMap()` 在处理 HTTP 请求参数时的具体使用。...
`request.getContextPath()`、`request.getMethod()`、`request.getProtocol()`、`request.getQueryString()`、`request.getRequestedSessionId()...getRequestURI()`、`request.getRemoteAddr()`和`request.getRemoteHost()`...
在IT行业中,网络通信是不可或缺的一部分,而HTTP协议作为互联网上应用最为广泛的一种网络协议,其请求(Request)对象为我们提供了获取客户端信息的重要途径。本文将深入探讨如何在Request中获取相关网络信息,包括...
Map, String[]> parameterMap = request.getParameterMap(); for (Map.Entry, String[]> entry : parameterMap.entrySet()) { String key = entry.getKey(); String[] values = entry.getValue(); for (String ...
另外,`request`对象还有其他重要方法,比如`getLocale()`用于获取用户的首选语言,`getAttribute()`和`setAttribute()`用于在请求作用域内存储和检索对象,以及`getParameterMap()`返回所有请求参数的键值对。...
在Java Servlet中,可以使用`getParameter()`或`getParameterValues()`方法,但要注意,如果是POST请求,需要先调用`request.getParameter()`之前调用`request.getParameterNames()`或`request.getParameterMap()`以...
Java 还提供了一个更方便的方法来获取所有请求参数,即使用 `request.getParameterMap()` 方法,该方法返回一个 `Map` 对象,其中包含所有的请求参数。 ```java Map, String[]> parameterMap = request....
Map, Object> formData = request.getParameterMap(); // 进行文件处理和表单数据处理... return ResponseEntity.ok("Form data and files successfully uploaded."); } ``` 在这个方法中,`request....