【问题标题】:Does this return the pointer to the values or does it copy the values?这会返回指向值的指针还是复制值?
【发布时间】:2012-11-20 03:57:04
【问题描述】:

好吧,我很困惑。我相信它会返回指向原始地图的指针?

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

现在 originalRequest 中的参数会在这些操作之后发生变化吗?还是它只是将值复制到参数中,而我对它们做什么并不重要,而 originalRequest 中的任何内容都不会改变?

【问题讨论】:

  • 这是一个设计问题。你的功能需求是什么?是否要修改锁定的参数映射?
  • @Lion 我有点想,这就是 ServletRequests 的过滤器应该如何工作的?过滤掉我们在其他地方不需要的参数?我误会了吗?

标签: java object servlets pointers copy


【解决方案1】:

返回的地图是不可变的地图,这可能是您看不到变化的原因。

根据getParameterMap javadoc

一个不可变的 java.util.Map 包含参数名称作为键和参数值作为映射值。参数映射中的键是字符串类型。参数映射中的值是字符串数组类型。

如果你想为请求设置一些值,你应该使用setAttribute

【讨论】:

    【解决方案2】:

    不,您不能删除或添加任何请求参数到请求对象。它们必须保留(当它们到达服务器时),直到请求对象超出范围(在请求处理周期结束之后)。

    从逻辑上讲,如果您被允许做类似的事情,那么请求对象将不再代表原始请求。在整个请求处理周期中,我们要处理的是客户端发出的请求,而不是被篡改的请求。

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

    【讨论】:

    • 我有点想过滤器是为了过滤掉原始请求中的参数??我认为这是使用它们的目的,如果不是,那么过滤器的用途是什么?
    • 您可以在此处阅读有关过滤器的信息:stackoverflow.com/tags/servlet-filters/info。它们有不同的用途,例如修改请求标头、安全检查、语言环境等。尽管如此,它们也是实现 Filter 接口的简单 Java 类。
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2013-05-09
    • 1970-01-01
    • 2023-03-07
    • 2021-03-22
    • 2019-07-25
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多