首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HttpServletRequest.getParameterMap()是不变的吗?

HttpServletRequest.getParameterMap()是不变的吗?
EN

Stack Overflow用户
提问于 2022-08-11 03:30:58
回答 2查看 57关注 0票数 0
代码语言:javascript
运行
复制
@GetMapping(value = "/getSalaries")
public List getSalaries(@RequestParam(value = "id")String id, HttpServletRequest request) {
    ParameterMap parameterMap = (ParameterMap) request.getParameterMap();
    parameterMap.setLocked(false);
    parameterMap.put("id", "b");
    System.out.println(request.getParameterMap().get("id"));
    
    return  null;
}

一切都很好,身份证被更改了。为什么身份证会被更改?

代码语言:javascript
运行
复制
@GetMapping(value = "/getSalaries")
public List getSalaries(@RequestParam(value = "id")String id, HttpServletRequest request) {
    ParameterMap parameterMap = (ParameterMap) request.getParameterMap();
    parameterMap.setLocked(false);
    System.out.println(request.getParameterMap().get("id"));
    parameterMap.put("id", "b");
    System.out.println(request.getParameterMap().get("id"));
    
    return  null;
}

抛出异常:[]抛出的异常请求处理失败;嵌套异常为java.lang.IllegalStateException:不允许对具有根本原因的锁定ParameterMap进行修改

java.lang.IllegalStateException:不允许对锁定的ParameterMap进行修改

因为我添加了代码“request.getParameterMap().get(”id“)”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-11 06:13:25

好的,所以问题是您使用ParameterMap的方式是错误的。

ParameterMap实际上不是不可变的,但是您应该将它视为不可变的。如果你想要改变它,正确的方法是复制它,然后改变它;例如,根据@追赶鱼的答案。

正如您所观察到的,您可以调用setLocked(false)以便更新地图。但问题是,您正在更改的映射仍然与HttpServletRequest共享。当您再次调用getParameterMap()时,request对象注意到映射当前已解锁,从源请求信息中刷新它,并再次锁定它。

通过读取源代码,您可以看到正在发生的事情;例如,https://github.com/quickhack/tomcat/blob/master/src/main/java/org/apache/catalina/connector/Request.java第1164行

您可能可以处理这个Tomcat特定的行为,但我的建议是不要。就像Servlet规范说的那样。

因为我添加了代码request.getParameterMap().get("id")

不完全同意。这是因为你给getParameterMap()打了两次电话。这些调用对参数映射的状态有无记录的副作用。

票数 0
EN

Stack Overflow用户

发布于 2022-08-11 03:51:30

看起来像是在修改接收到的表单参数映射,在Tomcat对HTTP处理的解释下,它是一个no-no。(ServletSpec3.0并没有明确指出这一点(第3章),而是强烈地暗示了这个方向(只有"get“方法,没有"set”方法)。

也许你可以试试:

代码语言:javascript
运行
复制
ParameterMap parameterMap = new HashMap(request.getParameterMap())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73314945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档