Мне нужно захватить все HTTP/https-запросы, которые проходят через браузеры моей системы с использованием сервлетов JAVA.Как захватить запросы с использованием сервлетов JAVA
Могу ли я достичь этого?
Мне нужно захватить все HTTP/https-запросы, которые проходят через браузеры моей системы с использованием сервлетов JAVA.Как захватить запросы с использованием сервлетов JAVA
Могу ли я достичь этого?
происходит через браузеры моей системы Вы можете сделать это с реализацией ServletRequestListener::requestInitialized(ServletRequestEvent sre)
Documentation говорят:
requestInitialized(ServletRequestEvent sre)
получает уведомление о том, что ServletRequest вот-вот попасть в область веб-приложения.
Класс может выглядеть следующим образом:
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Map.Entry;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
@WebListener
public class RequestListener implements ServletRequestListener {
public RequestListener() {}
public void requestDestroyed(ServletRequestEvent sre) {}
public void requestInitialized(ServletRequestEvent sre) {
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
System.out.println("Timestamp: " + new Timestamp(System.currentTimeMillis()));
System.out.println("SessionId: " + request.getSession(false));
System.out.println("RequestURL: " + request.getRequestURL());
System.out.println("Method: " + request.getMethod());
System.out.println("Parameters: ");
for (Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
System.out.println(entry.getKey() + " = " + Arrays.asList(entry.getValue()));
}
}
}
В консоли вы получите что-то вроде этого:
Отметка: 2017-01-25 19: 12: 04,36
SESSIONID : null
RequestURL: https://localhost:8181/jee6/ResponseFilterTest/Fiz
Способ: GET
Параметры:
p1 = [v1]
p2 = [v2]
Вместо в консоли вы можете хранить данные в БД или записи в журнал.
Если вам нужно различать местные и удаленные запросы, вы можете использовать request.getRemoteAddr()
. Для местных запросов 127.0.0.1
Сама природа HTTPS запрещает «захватывать» четкий текстовый запрос/ответ вне приложений, выполняющих их. Теперь, может быть, вы могли бы закодировать какой-то HTTP-прокси на основе сервлетов и создать собственные сертификаты и обмануть браузеры, установив их как надежные, но это не легкая работа, и прозрачность работы под HTTPS почти (если не полностью) невозможна. – GPI
Возможно, вы найдете jpcap полезным. В описании говорится: «jpcap - это набор классов Java, которые предоставляют интерфейс и систему для захвата сетевых пакетов». См. Https://sourceforge.net/projects/jpcap/ и https://javatutorial.net/capture-network-packages-java –
Использование Fiddler или WireShark –