Вопрос о выполнении пост-процессов javascript в приложении Java - PullRequest
1 голос
/ 13 сентября 2010

Традиционно мы всегда использовали xml в ответе, который анализируется методом Javascript для выполнения пост-процессов.Я придумал новую, более простую реализацию, которая использует скрытый ввод, установленный атрибутом requestAttribute и выполняемый в обратном вызове ajax.

JSP:

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

AJAX CALLBACK:

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 CODE:

request.setAttribute("jsPostProcess", jsPostProcess);

Это прекрасно работает, и намного проще добавлять JS post-процессы практически к любому вызову, независимо от того, насколько проста или сложна функциональность.Нет необходимости в настраиваемых js-методах для разбора.

Интересно, может ли кто-нибудь выявить какие-либо потенциальные проблемы с ним (например, проблемы безопасности?) Или высказать какие-либо предложения по другим альтернативам.В настоящее время мы используем Prototype и YUI 2. в интерфейсе.

1 Ответ

1 голос
/ 13 сентября 2010

Во-первых, этот неприятный код скрипта не нужен:

<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>

Поскольку атрибут «type» равен «text / plain», браузеры не будут пытаться его выполнитьэтот код, и вы можете получить «текст» элемента <script>, когда захотите.

...