@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;
}
一切都很好,身份证被更改了。为什么身份证会被更改?
@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“)”?
发布于 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()
打了两次电话。这些调用对参数映射的状态有无记录的副作用。
发布于 2022-08-11 03:51:30
看起来像是在修改接收到的表单参数映射,在Tomcat对HTTP处理的解释下,它是一个no-no。(ServletSpec3.0并没有明确指出这一点(第3章),而是强烈地暗示了这个方向(只有"get“方法,没有"set”方法)。
也许你可以试试:
ParameterMap parameterMap = new HashMap(request.getParameterMap())
https://stackoverflow.com/questions/73314945
复制相似问题