HttpServletRequest的getParameter()的坑

问题:

最近做项目的时候和对接方联调的时候,对接方会传入一个url给我们,然后经过一系列的操作之后,我们会将一些参数返回到该url上,回调给对接方。然而当使用了getParameter获取传入的url的时候发现,获取的url并不是对接方传入的完整的url。

例子:对接方传入url=http://abc.com/#/result/success这样类似的url
我们原本要返回的是(a=1&b=2是我方添加的参数):
http://abc.com/#/result/success?a=1&b=2

结果返回的是:
http://abc.com/?a=1&b=2
导致无法达到预期的效果

原因:

首先直接贴出来原因,是因为使用了HttpServletRequest下面的getParameter()方法去获取对接方的参数,(类似这样:http://localhost:8090/testGetParam?url=http://abc.com),getParameter(“url”)获取到的url会将"#“后面的内容全部忽略。因为”#"后的参数已经被忽略了,所以最后返回的时候就只有http://abc.com/?a=1&b=2。没有了#/result/success这个路径,就使得跳转的页面不正确。

验证过程:

我们将通过有没有"#“的对比试验来证明,getParameter()会忽略”#"后面的内容。

1.getParameter()不存在#号的实验:
url: http://localhost:8090/testGetParam?url=http://abc.com
结果:
HttpServletRequest的getParameter()的坑_第1张图片
2.getParameter()存在#号的实验
url: http://localhost:8090/testGetParam?url=http://abc.com/#/index.html
结果:
HttpServletRequest的getParameter()的坑_第2张图片

结论和解决方式:

1.有#号和没有#号的结果返回一模一样,因为getParameter()底层把遇到以后#后面的(包括#号自身),全部给忽略掉了,所以导致getParameter时,带有#的内容显示不出来(具体原理后面加文章分析)
2.解决的方式就是采用urlencode,现将url中的#号传入的时候,进行转码,要使用的时候在进行urldecode,就可以了。

欢迎关注公众号:我想问问天 领取学习资料和收获更多干货~
在这里插入图片描述

你可能感兴趣的:(java,Java修炼之旅,java,javaweb,HttpServlet)