2016-04-04 22 views
0

ウェブアプリケーションでは、検索を実行しているときにユーザーがfreeTextパラメータにJavaScriptを挿入しないようにしようとしています。Apache Velocityテンプレートのクエリ文字列を置き換える方法は?

これを行うには、Velocityファイルのヘッダにコードを記述して、クエリ文字列にfreeTextというパラメータが含まれているかどうかを確認した後、置換メソッドを使用してパラメータ値内の文字を置き換えます。しかし、ページをロードすると、元のクエリ文字列が表示されます。元のクエリ文字列を、置き換えられた文字を持つ新しいものに置き換える方法がわかりません。

この

は私のコードです:上記のコードで

#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( ')の代わりに、新しい$!replacedQueryString変数(すなわち、JavaScriptを取り除いたもの)を使用するようにそのファイルを更新しました。これで、すべてのページで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文字列は不変オブジェクトです。つまり、replace()メソッドは、元の文字列を変更せずに、変更された文字列を返します。

HttpServletRequestオブジェクトで指定されたパラメータマップは変更できないため、テンプレートが$request.getParameter('freeText')に依存している場合、この方法はうまくいきません。

代わりに、VelocityToolsを使用する場合は、テンプレートの$params.freeTextに頼ることができます。

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

(ツールのバージョン2.0以上が必要です):次に、あなたはこのマップが変更可能なパラメータにする曲があなたのWEB-INF/tools.xmlファイルすることができます。

次に、あなたのヘッダに、あなたが行うことができます:

#set($params.freeText = params.freeText.replace('confirm','replaced')) 
関連する問題