2017-01-25 2 views
-2

Мне нужно захватить все HTTP/https-запросы, которые проходят через браузеры моей системы с использованием сервлетов JAVA.Как захватить запросы с использованием сервлетов JAVA

Могу ли я достичь этого?

+0

Сама природа HTTPS запрещает «захватывать» четкий текстовый запрос/ответ вне приложений, выполняющих их. Теперь, может быть, вы могли бы закодировать какой-то HTTP-прокси на основе сервлетов и создать собственные сертификаты и обмануть браузеры, установив их как надежные, но это не легкая работа, и прозрачность работы под HTTPS почти (если не полностью) невозможна. – GPI

+0

Возможно, вы найдете jpcap полезным. В описании говорится: «jpcap - это набор классов Java, которые предоставляют интерфейс и систему для захвата сетевых пакетов». См. Https://sourceforge.net/projects/jpcap/ и https://javatutorial.net/capture-network-packages-java –

+0

Использование Fiddler или WireShark –

ответ

0

происходит через браузеры моей системы Вы можете сделать это с реализацией 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

Смежные вопросы