Могу ли я написать класс загрузчика Java, который будет перехватывать HTTP-запросы в загруженном классе? - PullRequest
1 голос
/ 11 октября 2010

У меня есть класс, в который я хочу перехватывать и перенаправлять HTTP-запросы. У меня также уже есть класс загрузчика, но все, что он делает, заменяет функции, содержащие HTTP-запросы, которые я хочу изменить.Есть ли способ перехватить HTTP-запросы в Java, чтобы я мог перенаправить их все проще?Вроде как прокси-оболочка.

Пояснение: приложение отправляет запрос GET или POST на URL.Мне нужно, чтобы содержимое оставалось прежним, просто измените URL.Перенаправления DNS не будут работать, заголовок HTTP узла должен быть корректным для нового сервера.

PS: это приложение для настольного компьютера, а не серверный сценарий.

Ответы [ 5 ]

2 голосов
/ 11 октября 2010

Громоздким, но надежным способом сделать это было бы заставить ваше приложение использовать прокси-сервер, а затем написать прокси-сервер, который вносит необходимые изменения. В вашем приложении может быть прокси-сервер; это не должно быть отдельной программой.

Чтобы использовать прокси, задайте пару системных свойств - http.proxyHost и http.proxyPort. Запросы, сделанные через HttpURLConnection, будут затем использовать этот прокси-сервер (если только они не переопределяют настройки прокси-сервера по умолчанию). Запросы, сделанные с использованием другого метода, такого как Apache HttpClient, не будут затронуты, я думаю, но, надеюсь, все ваши запросы используют HttpURLConnection.

Для реализации прокси-сервера, если вы используете Sun JRE, вам, вероятно, следует использовать встроенный HTTP-сервер ; установите один обработчик, сопоставленный с путем "/", и он будет отбирать все запросы, отправляемые вашим приложением, а затем может определить правильный URL-адрес для отправки и установить соединение с этим URL-адресом (со всеми заголовки тоже). Чтобы установить соединение, используйте URL.openConnection(Proxy.NO_PROXY), чтобы избежать запроса к прокси и, таким образом, попасть в бесконечный цикл. Затем вам нужно будет накачать вход и выход между двумя гнездами.

Единственный другой способ сделать это - переопределить HttpURLConnection с помощью нового обработчика, который направляет запросы в желаемое место назначения; вам нужно найти способ убедить класс URL использовать ваш обработчик вместо используемого по умолчанию. Я не знаю, как бы вы сделали это чисто.

1 голос
/ 11 октября 2010

В более раннем посте это должно дать представление о некоторых видах вставок байт-кода, которые можно выполнить: Java-программирование: внедрение байт-кода . Другим инструментом является Javassist , и вы можете найти некоторые ссылки в вики-статье Аспектно-ориентированное программирование (см. Раздел ткачей байт-кода).

Существуют некоторые продукты, которые динамически изменяют код.

В зависимости от того, что требуется, могут быть ... менее болезненные ... методы. Если вы просто хотите «перехватить» HTTP-запросы, другой вариант - просто использовать прокси (который может быть внешним процессом) и проходить через него. Использование прокси, скорее всего, потребует контроля над разрешением имен.

1 голос
/ 11 октября 2010

вы можете использовать фильтры сервлетов, которые перехватывают запросы, запросы могут быть далее упакованы, перенаправлены, пересланы или завершены отсюда.

http://www.oracle.com/technetwork/java/filters-137243.html

0 голосов
/ 11 октября 2010
  • Если вы можете изменить исходный код, просто измените его и добавьте дополнительный код к каждому HTTP-запросу.

  • Если вы не можете изменить исходный код, но он использует внедрение зависимостей, возможно, вы можете внедрить что-то для отлова запросов.

  • В противном случае: используйте аспектно-ориентированное программирование и перехватывайте URL-класс или все, что вы используете для выполнения HTTP-запросов. @AspectJ (http://www.eclipse.org/aspectj/doc/next/adk15notebook/ataspectj.html) довольно легкий и мощный.

0 голосов
/ 11 октября 2010

Контролируете ли вы весь код?Если это так, я предлагаю использовать Dependency Injection для внедрения конкретной реализации, которую вы хотите, что позволит вам вместо этого внедрить прокси-класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...