2016-04-04 27 views
0

Web uygulamasında, kullanıcıların arama çalıştırırken freeText parametresine JavaScript eklemelerini engellemeye çalışıyorum.Bir Apache Velocity şablonunda bir sorgu dizesi nasıl değiştirilir?

Bunu yapmak için , sorgu dizesi freeText adlı bir parametre içerip içermediğini denetlemek için başlık Velocity dosyasında kod yazdım ve eğer öyleyse, parametre değeri içindeki karakterleri değiştirmek için değiştirme yöntemini kullanın. Ancak, sayfayı yüklediğinizde, yine de özgün sorgu dizesini görüntüler - Özgün sorgu dizesinin yerine yeni değiştirilen karakterleri olan yeni birimin nasıl değiştirileceğine emin değilim.

Bu

benim kodudur: Yukarıdaki kodda

#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 

beklendiği gibi replacedQueryString değişken değişti (yani yedek beklendiği gibi yapılmıştır), ancak $ request.getQueryString() ve $ request.getParameter ('freeText'), daha önce olduğu gibi, sanki hiç bir zaman olmamış gibi.

Parametre almak için iyi çalışan bir request.getParameter yöntemi olduğu için, tersine aynı şeyi yapmak için request.setParameter yöntemi olacağını varsaydım, ancak yok.

+0

Bu değiştirmeden ne beklediğinizi sorabilir miyim? (Tabii ki, eski olanın olduğu yeni bir dizgeye sahip olmaktan başka. Hangi süreci değiştirmek/önlemek istersiniz?) Ben soruyorum çünkü bunu yaptıktan sonra bunu yapmak için çok geç olabilir ** sonra * * bir istek ve ** sunucu taraflı **. – MyBrainHurts

cevap

0

Ben konuyu kendim düzeltmek başardı - bu (her sayfada çağrılan) başka bir dosya içinde $ olduğunu ortaya çıktı! request.getParameter ('freeText') "değişkeni kullanıldı. Bu dosyayı güncelledim, böylece" $! request.getParameter (') yerine yeni $! replaceQueryString değişkenini (ör. JavaScript'i devre dışı bırakılmış olanı) kullanır. freeText ') "değişken. Bu, JavaScript'in her sayfada çalıştırılmasını engeller.

Bu, başlık Velocity dosyasındaki son çalışma kodudur:

#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 Dizesi, değiştirilemez bir nesnedir; bu, replace() yönteminin, orijinali değiştirmeden değiştirilmiş bir dize döndüreceği anlamına gelir.

HttpServletRequest nesnesi tarafından verilen parametreler değiştirilemediğinden, şablonlarınız $request.getParameter('freeText') numaralı belgeye dayanıyorsa bu yaklaşım iyi çalışmaz.

Bunun yerine, VelocityTools'a güveniyorsanız, şablonlarınızda $params.freeText'a güvenebilirsiniz.

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

(Versiyon araçlarından 2.0+ gereklidir): Ardından, ayar WEB-INF/tools.xml dosya bu değiştirilebilir harita parametreleri yapmak olabilir.

Ardından, başlığında, bunu yapabilirsiniz:

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