java request.getQueryString()值在chrome和ie浏览器之间有所不同

fei*_*ong 2 java url jsp servlets

我有一个请求,在浏览器地址栏中输入:

http://localhost:8888/cmens-tops-outwear/t-b-f-a-c-s-fLoose-p-g-e-i-o.htm?'"--></style></script><script>netsparker(0x0000E1)</script>=
Run Code Online (Sandbox Code Playgroud)

Tomcat6.0.35 我已经设定 URIEncoding="UTF-8"

request.getQueryString()在servlet中使用:

如果chrome,我明白了

'%22--%3E%3C/style%3E%3C/script%3E%3Cscript%3Enetsparker(0x0000E1)%3C/script%3E=
Run Code Online (Sandbox Code Playgroud)

如果ie,我明白了

'"--></style></script><script>netsparker(0x0000E1)</script>=
Run Code Online (Sandbox Code Playgroud)

为什么?

额外

我想request.getQueryString()创建一个uri

URI uri = URI.create(url)
Run Code Online (Sandbox Code Playgroud)

如果是:

java.net.URISyntaxException: Illegal character in query at index 36: /cmens/t-b-f-a-c-s-f-p-g-e-i-o.htm?'"--></style></script><script>netsparker(0x0000E1)</script>
    at java.net.URI$Parser.fail(URI.java:2809)
    at java.net.URI$Parser.checkChars(URI.java:2982)
    at java.net.URI$Parser.parseHierarchical(URI.java:3072)
    at java.net.URI$Parser.parse(URI.java:3024)
    at java.net.URI.<init>(URI.java:578)
    at java.net.URI.create(URI.java:840)
Run Code Online (Sandbox Code Playgroud)

如何确定queryString是否已被编码?

Bal*_*usC 5

HttpServletRequest#getQueryString()是每个未解码高清.另见javadoc(强调我的):

返回:

包含查询字符串的String;如果URL不包含查询字符串,则返回null.该值不会被容器解码.

基本上,如果您想手动解析它而不是getParameterXxx()出于某种原因使用方法(这会隐式解码参数!),您需要自己对其进行URL解码.

String decodedQueryString = URLDecoder.decode(request.getQueryString(), "UTF-8");
Run Code Online (Sandbox Code Playgroud)

至于为什么Chrome在IE不发送时编码,这是因为Chrome在安全/正确处理HTTP请求方面做得更好.这超出了你的控制范围.如果您打算出于某种原因手动解析查询字符串,请始终自行对查询字符串进行URL解码.该URIEncoding="UTF-8"配置有唯一的影响getParameterXxx()时GET请求方法.