2012-11-20 89 views
2

好吧,我感到困惑。我相信它会返回指向原始地图的指针?这是否返回指向值的指针还是复制值?

private HttpServletRequest originalRequest; 
    Map params = originalRequest.getParameterMap(); 
     params.remove("parameter-to-remove"); 
     params.put("parameter-to-add", "<a value>"); 

现在在这些操作后,原始请求中的参数是否会改变?或者它只是将值复制到参数中,并且它与我们所做的操作无关,而且它们将在originalRequest中进行更改?

+0

这是一个设计问题。你的功能要求是什么?你想修改一个锁定的参数映射吗? – Lion

+0

@Lion我有点想,这是ServletRequests的过滤器应该如何工作? FILTER OUT我们在其他地方不需要的参数?我误解了吗? –

回答

1

不,您不允许删除或向请求对象添加任何请求参数。它们必须保持(当它们到达服务器时),直到请求对象超出范围(在请求处理周期结束之后)。从逻辑上讲,如果你被允许做类似的事情,那么请求对象不会再代表原始请求。在整个请求处理周期中,我们要处理客户端发送的请求,而不是被篡改的请求。

您应该改用的方法是void setAttribute(java.lang.String name, java.lang.Object o)

+0

我是那种想法过滤器是从原始请求中滤除参数?我认为这是使用它们的目的,如果不是,那么过滤器的用途是什么? –

+0

你可以在这里阅读关于过滤器:http://stackoverflow.com/tags/servlet-filters/info。它们提供了不同的用途,例如修改请求标头,安全检查,语言环境等。尽管如此,它们也是实现“Filter”接口的简单Java类。 –

4

返回的地图是不可变的地图,这可能是您没有看到所反映的变化的原因。

作为每getParameterMap javadoc

含有参数名作为密钥和参数值作为映射值的不可变java.util.Map。参数图中的键是String类型。参数映射中的值是String数组类型。

如果您想设置一些值来申请,您应该使用setAttribute