Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть пятая   В заключительной части материала речь идёт о сохранении разобранного запроса в документ базы Notes и об изменениях, сделанных для этого сохранения в классе Memo
Шаблоны и примеры Читать статью
 
Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть четвёртая   В предлагаемой вниманию читателя части описания идёт речь об обработке полученной информации запроса после разбора multipart-data
Шаблоны и примеры Читать статью
 
Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть третья   Продолжение материала, посвящённого сервлету Domino, выполняющего обработку post-запроса с данными типа multipart/form-data. В настоящей части продолжается описание разбора запроса к сервлету
Шаблоны и примеры Читать статью
 


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

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

Задача 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