如果 Map 仅对应用程序不可变,对应用程序服务器不可变
它在 API 中是不可变的,是的。也有道理,改请求参数映射有什么意义呢?servletcontainer 实现当然可以在“幕后”持有它的可变映射。但是你不应该担心实现的具体细节。
如果允许应用服务器可以将实例重用于另一个请求(例如,如果参数及其值与前一个请求中的相同)
不,服务器不这样做。它只是创建一个新的。参数绑定到特定请求。
如果您想在会话期间收集每个请求的参数,那么您需要自己执行此操作。最好的地方是Filter
.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest hsr = (HttpServletRequest) request;
List<Map<String, String[]>> allParameters = (List<Map<String, String[]>>) hsr.getSession().getAttribute("allParameters");
if (allParameters == null) {
allParameters = new ArrayList<Map<String,String[]>>();
hsr.getSession().setAttribute("allParameters", allParameters);
}
allParameters.add(hsr.getParameterMap());
chain.doFilter(request, response);
}