簡體   English   中英

如何替換Apache Velocity模板中的查詢字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM