«esapi» не определено в Websphere 7

Следовали esapi4java-core-2.0-install-guide.pdf для Eclipse и применяли его в среде Websphere 7.5.

Шаг 1. Я добавил esapi.jar в библиотеки («Проект» > «Свойства» > «Путь сборки Java» > вкладка «Библиотеки» > «Добавить внешние JAR-файлы»).

Шаг 2. Я нашел файлы esapi и validation .properties в папке на своем компьютере.

Шаг 3. Я решил добавить esapi для всех конфигураций запуска (Windows > Настройки > Java > Установленные JRE). Я выделил WebSphere Application Server v7.0 JRE, выбрал «Изменить» и добавил esapi.jar в этот список библиотек. В той же форме я добавил аргумент -Dorg.owasp.esapi.resources="/path/to/.esapi" в приглашение VM Arguments по умолчанию, путь к месту расположения моих файлов esapi и валидации .properties.

Вот код на странице JSP, который не работает:

<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ page import="java.net.*" %>

<script type="text/javascript" language="javascript">

function validateForm()
{

    var userURL = "http://www.google.com";
    var isValidURL = ESAPI.validator().isValidInput("URLContext", userURL, "URL", 255, false); 
    if (isValidURL) {
        alert("true");
    } else {
    alert("false");
    }
}

</script>

После выполнения этого фрагмента кода я получаю сообщение об ошибке: «ESAPI» не определен (что происходит в операторе var isValidURL).

Что мне не хватает?


person Mark    schedule 15.05.2014    source источник


Ответы (1)


Я не вижу, где вы импортировали esapi в jsp.

Попробуй это:

<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ page import="java.net.*, org.owasp.esapi.ESAPI, org.owasp.esapi.Validator" %>


<script type="text/javascript" language="javascript">

function validateForm()
{

    var userURL = "http://www.google.com";
    var isValidURL = <% ESAPI.validator().isValidInput("URLContext", userURL, "URL", 255, false); %>
    if (isValidURL) {
        alert("true");
    } else {
    alert("false");
    }
}

</script>

Также обратите внимание, я настоятельно рекомендую выполнять проверку в принимающем контроллере, а не в jsp... накладные расходы на компиляцию JSP - это убийство без добавления накладных расходов на синтаксический анализ ввода. Другое предупреждение, которое я вам дам, заключается в том, что если вы обратите внимание на документацию esapi, вызов isValidInput() игнорирует канонизацию, что абсолютно необходимо. Вместо этого вы захотите использовать getValidInput(). Если вы чувствуете, что вам нужно использовать isValidInput(), вам нужно убедиться, что вы вручную вызываете canonicalize(), который является методом в классе Encoder. Также обратите внимание, что эта строка:

var isValidURL = ESAPI.validator().isValidInput("URLContext", userURL, "URL", 255, false); 

делает критическую ошибку в том, что ESAPI не является JavaScript библиотекой. Этот вызов должен выглядеть так:

var isValidURL = <% ESAPI.validator().isValidInput("URLContext", userURL, "URL", 255, false); %>

И в целом, как указано выше, вы хотите выполнить эту проверку на контроллере, который будет использовать этот jsp в качестве входных данных, а не на самом jsp. (Скриптлеты работают медленно, и их следует избегать.)

person avgvstvs    schedule 15.05.2014
comment
Я добавил оператор импорта - спасибо, но все равно получаю ту же ошибку. Поскольку инструкции по установке неясны (о том, какой JRE назначить аргументы виртуальной машины, из которых я произвольно выбрал WebSphere Application Server v7.0 JRE), я также попытался установить общий аргумент виртуальной машины в консоли администратора › Серверы приложений › (мой сервер ) › Java и управление процессами › Определение процесса › Виртуальная машина Java. Это тоже не имело значения. Я попытался добавить системные свойства в server.xml, чтобы указать на два файла .properties - все еще не работает. Идеи? - person Mark; 16.05.2014
comment
Вы получаете трассировку стека или ошибку браузера? Если это трассировка стека, добавьте ее к вопросу. Если это из браузера, измените свое назначение на isValidURL - person avgvstvs; 16.05.2014
comment
avgvstvs - ваши исправления действительно помогли решить мою проблему - спасибо. Теперь у меня новая проблема. ESAPI.properties найден, но я получаю исключение Uncaught, созданное в одном из сервисных методов сервлета /WEB-INF/tiles-components/frm/main.jsp в приложении (myapp)EAR. Создано исключение: com.ibm.websphere.servlet.error.ServletErrorReport: java.lang.NoClassDefFoundError: org.apache.commons.fileupload.ProgressListener. Я загрузил и добавил org.apache.commons.fileupload.jar в свои зависимости EAR, но это не помогло. Чего не хватает? - person Mark; 19.05.2014
comment
Точная библиотека, которую вы хотите, находится здесь: mvnrepository.com/artifact/commons-fileupload/ - person avgvstvs; 19.05.2014
comment
Я бы убедился, что библиотека действительно попала в путь к классам сервера. Если вы используете maven/gradle, вам, вероятно, придется выполнить очистку перед сборкой. - person avgvstvs; 19.05.2014
comment
Я разобрался с этой последней проблемой. Несмотря на то, что я добавил этот jar-файл в EAR моего приложения, мне по-прежнему нужно было указать ссылку на этот jar-файл в настройках модулей J2EE для веб-проекта моего приложения (выберите веб-проект > проект > свойства > зависимости модуля Java EE > модули J2EE). Делая это, пройдите мимо этого исключения. Теперь страница отображается, но я получаю новую ошибку, но она появляется из-за того, как я реализовал код валидатора, поэтому похоже, что я хорошо продвигаюсь вперед. PS: НЕ заключайте путь к файлу esapi.properties в кавычки в аргументе виртуальной машины, даже если это указано в инструкциях по установке. - person Mark; 19.05.2014