我在Tomcat容器上用Java编写了一个hello world web应用程序。我有一个查询字符串
code=askdfjlskdfslsjdflksfjl#_=_
在网址的=
两侧加上下划线。当我尝试通过request.getParameter("code")
检索servlet中的查询字符串时,我只得到askdfjlskdfslsjdflksfjl
。 #
之后的部分缺失。
这是如何引起的?如何解决?
答案 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>
<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应用程序。