如何替换Apache Velocity模板中的查询字符串?

时间:2016-04-04 09:26:37

标签: java replace query-string velocity getparameter

在我的网络应用程序中,我试图阻止用户在运行搜索时在freeText参数中插入JavaScript。

为此,我在标题Velocity文件中编写代码以检查查询字符串是否包含名为freeText的参数,如果是,则使用replace方法替换参数值中的字符。但是,当您加载页面时,它仍会显示原始查询字符串 - 我不确定如何将原始查询字符串替换为具有替换字符的新查询字符串。

这是我的代码:

#set($freeTextParameter = "$request.getParameter('freeText')")
freeTextParameter: $freeTextParameter

#if($freeTextParameter)
    ##Do the replacement: 
    #set($replacedQueryString = "$freeTextParameter.replace('confirm','replaced')")
    replacedQueryString after doing the replace: $replacedQueryString
    The query string now: $request.getQueryString()
    The freeText parameter now: $request.getParameter('freeText')
#end

在上面的代码中,replacementQueryString变量已按预期更改(即替换已按预期执行),但$ request.getQueryString()和$ request.getParameter(' freeText')仍然和以前一样,好像更换从未发生过一样。

看到有一个request.getParameter方法适用于获取参数,我假设会有一个request.setParameter方法反向执行相同的操作,但是没有。

1 个答案:

答案 0 :(得分:0)

Java String是一个不可变对象,这意味着replace()方法将返回一个更改的字符串,而不更改原始字符串。

由于HttpServletRequest对象给出的参数映射无法修改,如果模板依赖于$request.getParameter('freeText'),这种方法效果不佳。

相反,如果您依赖VelocityTools,那么您可以在模板中依赖$params.freeText。然后,您可以调整WEB-INF/tools.xml文件以使此参数映射可更改:

<?xml version="1.0">
<tools>
  <toolbox scope="request">
    <tool key="params" readOnly="false"/>
    ...
  </toolbox>
  ...
</tools>

(需要2.0+版本的工具)。

然后,在标题中,您可以执行以下操作:

#set($params.freeText = params.freeText.replace('confirm','replaced'))