2010-09-13 53 views
1

傳統上,我們一直在響應中使用xml,該響應由Javascript方法分析以執行後處理。我想出了一個新的,更簡單的實現,它使用由requestAttribute設置的隱藏輸入並在ajax回調中執行。關於在Java應用程序中執行JavaScript後處理的問題

JSP:

<% 
    String jsPostProcess = (String)request.getAttribute("jsPostProcess"); 
    if (jsPostProcess!=null && jsPostProcess.trim().length()>0){   
%> 
     <input type="hidden" id="jsPostProcess" name="jsPostProcess" 
      value="<%= jsPostProcess %> "/> 
<% } %> 

Ajax回調:

var callback = { 
    success: function(response) { 
     var div = $(divId); 
     if (div){ 
      div.innerHTML = response.responseText;    
     } 
     var jsPostProcess = $('jsPostProcess'); 
     if (jsPostProcess) 
      eval(jsPostProcess.value); 
    }, 
    failure: function(response) { 
     alert('Something went wrong!'); 
    } 
} 

servlet代碼:

request.setAttribute("jsPostProcess", jsPostProcess); 

它精美的作品,它是如此簡單得多添加JS後期處理幾乎任何呼叫,無論功能多麼簡單或複雜。不需要定製的js方法來解析。

好奇的是,如果任何人都可以識別它的任何潛在問題(如安全問題?)或爲其他選擇提出任何建議。我們目前在前端使用Prototype和YUI 2。

回答

1

首先,有沒有必要爲不愉快的scriptlet代碼:

<c:if test='${not empty jsPostProcess}'> 
    <input type='hidden' id='jsPostProcess' name='jsPostProcess' value='${jsPostProcess}'> 
</c:if> 

接下來的事情是,我希望某處這點之前的「jsPostProcess」值已經擦洗,這樣它不會破壞標記(例如,如果它包含引號)。

只要調用eval()就像這樣的值似乎有點危險,但也許你知道它會是什麼。

最後,我會提供一個建議,作爲替代方案,如果「後處理」代碼不是太大,您可以將它發送迴應答頭。那麼你就不必在你的頁面上放置任何無意義的標記。

哦,最後也是:你可能想讓<input>被禁用。或者,你甚至不必使用輸入:您可以使用這一招:

<script id='jsPostProcess' type='text/plain'> 
    ${jsPostProcess} 
</script> 

因爲「類型」屬性是「text/plain的」瀏覽器不會嘗試執行代碼,並且您可以隨時獲得<script>元素的「文本」。

+0

感謝您的回覆!一旦我重新閱讀你的文章幾次,我就完成了所有的工作(儘管我之前的評論我編輯哈哈!!)。優秀的建議。非常感激! – skel625 2010-09-13 17:09:16

+0

「就像這樣的值調用eval()似乎有點危險,雖然也許你很清楚它會發生什麼。」我認爲同樣的事情,但我想不出任何可以被惡意利用的方式,因爲後處理都是非常標準的事件,不允許比用戶通常可能的更多的「黑客能力」 。但我不是js安全問題的專家! ;) – skel625 2010-09-13 17:19:08

+0

好吧,只要這些東西沒有任何用戶提供的內容,你沒問題。如果是這樣,那麼也有一些方法可以保護你自己。 – Pointy 2010-09-13 18:55:59

相關問題