[英]How to replace a query string in an Apache Velocity template?
在我的Web應用程序中,我試圖阻止用戶在運行搜索時在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
在上面的代碼中,replacedQueryString變量已按預期更改(即,替換已按預期進行),但是$ request.getQueryString()和$ request.getParameter('freeText')仍然與以前相同,如果更換從未發生過。
看到有一個request.getParameter方法可以很好地獲取參數,我假設會有一個request.setParameter方法來做相反的事情,但事實並非如此。
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'))
我自己設法解決了這個問題-原來還有另一個文件(在每個頁面上都被調用),其中使用了$!request.getParameter('freeText')“變量。我已經對該文件進行了更新,使用新的$!replacedQueryString變量(即,刪除了JavaScript的變量)而不是現有的“ $!request.getParameter('freeText')”變量,現在可以防止在每個頁面上執行JavaScript。
因此,這是標題Velocity文件中的最終工作代碼:
#set($freeTextParameter = "$!m.request.httpRequest.getParameter('freeText')")
#if($freeTextParameter)
#set($replacedQueryString = "$freeTextParameter.replace('confirm','').replace('<','').replace('>','').replace('(','').replace(')','').replace(';','').replace('/','').replace('\"','').replace('&','').replace('+','').replace('script','').replace('prompt','').replace('*','').replace('.','')")
#end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.