2016-04-04 2 views
0

В моем веб-приложении я пытаюсь помешать пользователям вставлять JavaScript в параметр freeText при запуске поиска.Как заменить строку запроса в шаблоне скорости Apache?

Для этого я написал код в файле 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, чтобы сделать то же самое в обратном порядке, но его нет.

+0

Могу ли я спросить, что вы ожидаете от этой замены? (Конечно, кроме новой строки, в которой был старый. Какой процесс вы хотите изменить или предотвратить?) Я спрашиваю, потому что я думаю, что может быть слишком поздно делать это при рендеринге представления ** после * * запрос и ** сервер односторонний **. – MyBrainHurts

ответ

0

мне удалось решить проблему сам - оказалось, что там был еще один файл (который вызывается на каждой странице), в которой $! request.getParameter ('freeText') ". Я обновил этот файл, чтобы вместо новой переменной $! replace.getParameter использовать новую переменную $! replaceQueryString (то есть ту, которая была удалена из JavaScript) 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 
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')) 
Смежные вопросы