Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 
Задача Domino HTTP. Агент Скачать файлы одним архивом и обработка отдаваемых пользователю файлов. Часть вторая   Завершаем описание решения задачи по генерации файлов web-агентом и выдаче файлов, задействуя сервлет, также представляемый в настоящей статье
Шаблоны и примеры Читать статью
 


Шаблоны и примеры

Главная   Библиотека   Шаблоны и примеры

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть четвёртая

Николай Норкин

г. Киров

notesnet@notesnet.ru

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть первая

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть вторая

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть третья

Инициализация сервлета. Загрузка профилей

Профили из базы профилей в процессе инициализации загружаются в объект java.util.Map. Каждый элемент этого объекта представляет собой объект local.upload.Profile с хранением значений из документа профиля и функциями доступа к этим значениям

Код процессв инициализации сервлета

public class UploadProcess extends HttpServlet {

private static final String PROFILE_REPLICA_ID = "43258640002AF57D"; // Каюсь,  иногда использую и такого рода константы, надеюсь, что у коллег есть свои методы настроек на нужные ресурсы

protected java.util.Map profiles = null;

public void init(ServletConfig config) throws ServletException {

lotus.domino.Session session = null;

try {

lotus.domino.NotesThread.sinitThread();

session = lotus.domino.NotesFactory.createSession();

System.out.println("Инициализация сервлета");

this.initProfiles(session);

}catch (Exception ex) {}

try {} catch (Exception e) {}

finally {

try {

if (session != null) session.recycle();

lotus.domino.NotesThread.stermThread();

} catch (Exception e) {}

}

}

protected void initProfiles(lotus.domino.Session session) {

lotus.domino.DbDirectory directory = null;

lotus.domino.Database database = null;

lotus.domino.View view = null;

try {

directory = session.getDbDirectory(null);

database = directory.openDatabaseByReplicaID(this.PROFILE_REPLICA_ID);

if (database == null) return;

view = database.getView("profiles");

if (view == null) return;

view.setAutoUpdate(false);

if (this.profiles == null)

this.profiles = new HashMap();

else

this.profiles.clear();

lotus.domino.Document document;

lotus.domino.Document nextDocument;

String key;

document = view.getFirstDocument();

Profile profile;

do{

if(document == null) break;

nextDocument = view.getNextSibling(document);

profile = new Profile(document);

key = profile.getKey();

if (!key.equals(""))

if(!this.profiles.containsKey(key))

this.profiles.put(key, profile);

document.recycle();

document = nextDocument;

} while (true);

} catch(Exception ex) {

ex.printStackTrace();

}

finally {

try {

if(view != null) view.recycle();

if(database != null) database.recycle();

} catch (Exception e) {}

}

}

В результате все профили загружены в объект this.profiles. Доступ к профилю - по ключу, переданному в качестве параметра запроса и полученному в переменную parameter

String parameter = _request.getQueryString(); // переданный ключ профиля настроек

  local.upload.Profile profile = null;

  try {profile = (local.upload.Profile) this.profiles.get(parameter); } catch (Exception e) {}

Обновление профилей

Для перезагрузки изменений, сделанных в настройках профилей в базе настроек, будем пользоваться get-запросом к сервлету /servlets/UploadProcess

В сервлете этот запрос обрабатывается в методе doGet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.initProfiles();

}

protected void initProfiles() {

lotus.domino.Session session = null;

try {

NotesThread.sinitThread();

session = NotesFactory.createSession();

System.out.println("Переинициализация сервлета");

this.initProfiles(session);

}catch (Exception ex) {}

try {} catch (Exception e) {}

finally {

try {

if (session != null) session.recycle();

NotesThread.stermThread();

} catch (Exception e) {}

}

}

Выполнение проверок. Анонимность запроса

Имя пользователя получается из заголовка запроса

String user = _request.getRemoteUser();

и проверяется в функции checkAnonymousRequired

protected boolean checkAnonymousRequired(local.upload.Profile profile, String user) {

try {

if (profile.isAnonymousPossible()) return true;

return !user.equalsIgnoreCase("Anonymous");

}

catch (Exception e) {}

return false;

}

Выполнение проверок. Наличие обязательных полей

Список обязательных полкй запроса получается из профильного документа, после чего каждый элемент проверяется в карте айтемов

protected boolean checkRequired(ru.medkirov.servlets.uploadprocess.DocumentContext documentContext,

local.upload.Profile profile, java.io.PrintWriter out) {

try {

java.util.Vector required = profile.getRequired();

for (int i = 0; i < required.size(); i++) {

String itemName = (String) required.elementAt(i);

if (itemName.toLowerCase().equals("attached")) {

if (!documentContext.hasAttachment()) {

this.setError(out, "Не найдены обязательные для обработки вложения"); return false;

}

}

else {

ru.medkirov.servlets.uploadprocess.Item item = null;

try {item = documentContext.getFileItem(itemName);} catch (Exception e) {}

if (item == null) {this.setError(out, "Не заполнены обязательные для заполнения поля"); return false;}

String value = item.getItemValueString();

if (value.contentEquals("")) {this.setError(out, "Не заполнены обязательные для заполнения поля"); return false;}

}

}

return true;

}

catch (Exception e) {}

return false;

}

Выполнение проверок. ReCaptcha

При решении использовался механизм проверки программной отправки запросов Google ReCaptcha 2. Проверка реализована через обращение к сервису Google с передачей секретного ключа, кода recaptcha, полученного в запросе клиента, и (опционально) ip-адреса клиента. Ответ от сервиса в виде JSON анализируется на значение success. Для работы с json в код подключается пакет org.json.simple (json-simple-1.1.1.jar)

В опубликованном коде сервлета вызов проверки закомментирован. Для её использования нужно получить секретный ключ рекапчи для своего сайта, прописать его в константу класса RecaptchaVerify2bis и раскомментировать строку вызова проверки в классе сервлета

public class RecaptchaVerify2bis {

protected static String SECRET_KEY = "...";

protected static String VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify";

public RecaptchaVerify2bis() {

}

public static boolean verify(String reCaptcha) {

return verify(reCaptcha, null);

}

public static boolean verify(String reCaptcha, String remoteIp) {

try {

String ip = remoteIp;

try {if (ip.equals("")) ip = null;} catch (Exception e) {}

return doPostSSL(reCaptcha, ip);

}

catch (Exception e) {}

return false;

}

protected static boolean doPostSSL(String reCaptcha, String remoteIp) {

java.io.OutputStream output = null;

javax.net.ssl.HttpsURLConnection connection = null;

try {

initSSL();

java.net.URL url = new java.net.URL(VERIFY_URL);

connection = (javax.net.ssl.HttpsURLConnection) url.openConnection();

connection.setRequestMethod("POST");

connection.setUseCaches(false);

// записать параметры

connection.setDoOutput(true);

output = connection.getOutputStream();

String data = "secret=".concat(SECRET_KEY).concat("&response=").concat(reCaptcha);

if (remoteIp != null)

data = data.concat("&remoteip=").concat(remoteIp);

output.write(data.getBytes());

output.flush();

output.close();

int responseCode = connection.getResponseCode();

if (responseCode == java.net.HttpURLConnection.HTTP_OK) {

java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(connection.getInputStream()));

java.lang.StringBuilder response = new java.lang.StringBuilder();

String line;

while ((line = reader.readLine()) != null) { response.append(line);}

// callback success

String responseString = response.toString();

reader.close(); // close BufferReader

org.json.simple.JSONObject json = getJSonObjectFromString(responseString);

return ((Boolean)json.get("success")).booleanValue();

}

}

catch (Exception e) {}

finally {

if (output != null)

try {output.close();} catch (Exception e) {}

if (connection != null)

try {connection.disconnect();} catch (Exception e) {}

}

return false;

}

private static void initSSL()   {

javax.net.ssl.SSLContext sc = null;

try {

sc = javax.net.ssl.SSLContext.getInstance("TLS");

}

catch (java.security.NoSuchAlgorithmException ex)        {            ex.printStackTrace();        }

javax.net.ssl.TrustManager[] tma = { new MyTrustManager() };

    try { sc.init(null, tma, null); } catch (java.security.KeyManagementException ex1) {  ex1.printStackTrace(); }

javax.net.ssl.SSLSocketFactory ssf = sc.getSocketFactory();

javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(ssf);

}

static class MyTrustManager    implements javax.net.ssl.X509TrustManager {

public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType)        {        }

public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)        {        }

public java.security.cert.X509Certificate[] getAcceptedIssuers()        {            return null;        }

}

protected static org.json.simple.JSONObject getJSonObjectFromString(String jsonText) {

try {

org.json.simple.parser.JSONParser jsonParser = new org.json.simple.parser.JSONParser();

org.json.simple.JSONObject jsonObject = (org.json.simple.JSONObject)jsonParser.parse(jsonText);

return jsonObject;

}

catch (Exception e) {}

return null;

}

}

Антивирусная проверка

К сожалению, антивирусная проверка на настоящий момент осталась нереализованной

Наиболее перспективной к реализации выглядит использование пакета API антивируса clamav (описание, libclamav-1.0.jar), но это (как, впрочем, и любое другое решение) должно предваряться развёртыванием инфраструктуры соответствующего антивируса (минимум, в случае работы на локальном web-сервере - инсталяция программного обеспечения антивируса на операционной системе сервера). Пока времени не хватает даже на развёртывание антивируса для тестирования жизнеспособности решения. Если у кого-то из читателей есть опыт использования антивирусного пакета в java-решениях, прошу поделиться этим опытом

Ссылки

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть первая

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть вторая

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть третья

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть пятая

Код сервлета

Проект Google ReCaptcha

О подключении api к clamav
 
  Опубликовано — 02/17/2021 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU