请求参数值中缺少#之后的部分

时间:2011-12-14 16:37:21

标签: java servlets query-string

我在Tomcat容器上用Java编写了一个hello world web应用程序。我有一个查询字符串

code=askdfjlskdfslsjdflksfjl#_=_

在网址的=两侧加上下划线。当我尝试通过request.getParameter("code")检索servlet中的查询字符串时,我只得到askdfjlskdfslsjdflksfjl#之后的部分缺失。

这是如何引起的?如何解决?

3 个答案:

答案 0 :(得分:5)

那是因为#之后的url部分不是查询的一部分。

Section 3.4适当的RFC说:

  

查询组件由第一个问题指示      标记("?")字符并以数字符号("#")字符结束      或者在URI的末尾。

答案 1 :(得分:1)

#仅由浏览器解释,而不是服务器。如果要将#字符传递给服务器,则必须对其进行URLEncode。

示例:

URLEncoder.encode("code=askdfjlskdfslsjdflksfjl#=", "UTF-8");

答案 2 :(得分:1)

请阅读percent encoding on Wikipedia。网址中的#=reserved characters。只有未保留的字符可以在URL中使用,所有其他字符应该是URL-encoded#的网址编码值为%23=%3D。所以这应该做:

code=askdfjlskdfslsjdflksfjl%23_%3D_

如果这实际上源自某些JSP中的HTML <a>链接,那么:

<a href="servletUrl?code=askdfjlskdfslsjdflksfjl#_=_">some link</a>

然后您应该将其更改为使用JSTL's <c:url>

<c:url var="servletUrlWithParam" value="servletUrl">
    <c:param name="code" value="askdfjlskdfslsjdflksfjl#_=_" />
</c:url>
<a href="${servletUrlWithParam}">some link</a>

以便生成为

<a href="servletUrl?code=askdfjlskdfslsjdflksfjl%23_%3D_">some link</a>

请注意,这与Java / Servlets本身无关,这适用于每个Web应用程序。