![](/img/trans.png)
[英]Why Retrofit cannot encode properly query string with square brackets?
[英]Why is fn:escapeXml() adding square brackets to String
我有一个 Java/JSP webapp,在我将fn:escapeXml()
添加到构造 URL 的标记后,它开始显示错误。
原来的代码是
<p id="provide-link">
Follow this link to see the source data:
<q:link href="../resources/source-data.jsp"
sourceData="${chart.parameters.source}">
Source Data
</q:link>
</p>
q:link
是一个自定义标签,它以href
作为基础和sourceData
作为 GET 参数创建超链接。 例如,如果chart.parameters.source = 'dataset03'
,则页面中嵌入的链接为
../resources/source-data.jsp&sourceData=dataset03
。
自定义标记q:link
用于处理chart.parameters.source
是多个数据源的集合的情况,这是允许的情况。
此代码正常工作,但由于 GET 参数而容易受到脚本插入攻击。 因此,我在代码中添加了 JSTL 函数escapeXml()
以防止出现这种情况:
<p id="provide-link">
Follow this link to see the source data:
<q:link href="../resources/source-data.jsp"
sourceData="${fn:escapeXml(chart.parameters.source)}">
Source Data
</q:link>
</p>
当我这样做时,方括号被添加到 URL 中:
../resources/source-data.jsp&sourceData=[dataset03]
这是一个问题,因为[dataset03]
不是参数的有效值。
我在网上找到的关于这个问题的唯一一件事是这个问题,它没有提供完整的答案,但表明${fn:escapeXml(chart.parameters.source)}
可能会输出为一个数组,因为它包含fn:escapeXml()
。 理论是,当q:link
转换为 String 时,它会捕获并保留 Array 括号。
任何人都知道发生了什么以及如何阻止它?
你的最后一个建议对我来说似乎是正确的, fn:escapeXml 函数有一个 String 类型的参数。 如果传递的参数是一个集合,它将通过 toString() 方法(添加 [])进行转换。 它附加在 fn:escapeXml() 调用之前,因此它没有添加到其中。
Rem:它不会在没有 escapeXml 函数的情况下追加,因为您的自定义标签会直接检索和处理集合(可能会迭代其内部的值)。
在将 Collection 作为参数传递给 escapeXml fct 之前转换它的一种解决方案; 通过标签或 EL 表达式 (map()...)
REM2:而不是使用自定义的标签进行编码您的网址参数,已经有这些标准JSTL标记,做类似的工作: https://www.tutorialspoint.com/jsp/jstl_core_param_tag.htm HTTPS://www.tutorialspoint。 com/jsp/jstl_core_url_tag.htm
希望会有所帮助,亲切的问候,塞德里克
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.