HttpServletRequest - SetParameter

11

我知道可以使用HttpServletRequest.getParameter()方法获取URL参数值。

那么能否用相应的方法来设置/替换这个值呢?

5个回答

10

不,没有。

你只能更改属性,而不能更改参数。

要实现类似的功能,唯一的方法是使用一个类来包装请求并返回其他内容(对于getParameter)。

相关的好奇心:在某些Servlet容器中存在一个错误,可以让你执行request.getParameterValues(name)[0] = "newValue",但这只会导致不一致性。


是的,你总是可以将它包装起来,尽管可能有相当多的方法。 - Steve Kuo
1
虽然这是一个老问题,但我想补充一下,这样做的一个用例是创建一个单元测试或功能测试。因此,在这种情况下,可以通过使用Mock库或使用包含可修改参数映射的提供的请求存根来完成。 - Josef.B

6
您可以通过将HttpServletRequest替换为自定义的HttpServletRequestWrapper实现,将parametermap变成可修改的映射,然后在链中早期放置一个Filter来替换parametermap。

然而,这似乎是一种变通方法。在其中一条评论中,您表示希望对参数进行编码(实际上:对它们进行解码,因为它们已经被编码了)。您正在寻找错误的解决方案。对于GET请求参数,编码需要在servlet容器本身中设置(例如Tomcat,在HTTP连接器的URIEncoding属性中设置即可)。对于POST,您需要通过ServletRequest#setCharacterEncoding()进行设置。还请参阅此文章中的详细解决方案(但请先阅读整篇文章以了解完整的情况)。


4
我不认为有这样的方法。但你可以以类似的方式使用setAttribute() 方法; 你只需要稍微修改一下,以便在后面获取值时使用getAttribute()而不是getParameter()方法。

3
不,然而你为什么想这样做呢?可能还有其他的方法可以完成你需要做的事情。

在它到达servlet之前?你需要研究一下JavaScript——一旦它到达servlet,再试图对它们进行编码就没有什么意义了。或者你是在谈论将其编码以便重定向到另一个servlet/page吗?如果是这种情况,你需要在构建新的URL时对其进行编码。可以查看java.net.URLEncoder(http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLEncoder.html);可能会有所帮助。 - MCory
我认为他不是在谈论URL编码。请求参数已经被Servlet容器解码了。他更多地谈论字符编码。 - BalusC
字符编码将是一个完全不同的问题。这可以使用String.getBytes方法完成,但显然存在一些陷阱(在我所做的工作中,我从未亲自担心过字符编码,因此我不是一个很好的咨询者)。快速的谷歌搜索给了我http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html。在页面的3/4处有一个名为“使用String类进行编码和解码的潜在陷阱”的部分,其中将有更多信息,但整个文档似乎是一个很好的选择。 - MCory
不要使用String#getBytes()等方法,这样很麻烦。请查看我在这个话题中的答案。 - BalusC
我同意BalusC的观点——如果您正在尝试做这件事,那么一定有比getBytes更好的方法。如果BalusC的答案不适合您的需求,请查找一些不错的库——http://commons.apache.org/lang/(Apache Commons Lang)支持使用不同的字符编码进行工作,并且我相信还有许多其他的库也可以胜任。编辑:BalusC的文章真的很好,在这方面似乎已经涵盖了基础知识。(我还没有足够的声望来评论别人的答案,否则我会的;但已经投票支持了)。 - MCory

1

请求参数是通过HTTP从客户端提交到servlet或JSP的。它们不是由服务器端代码设置的,因此不需要任何设置方法(setParameter())。

此外,这将增加安全性,防止任何人更改请求参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接