2010-10-11 15 views
1

J'ai une classe dans laquelle je veux accrocher et rediriger les requêtes HTTP. J'ai aussi une classe loader déjà écrite, mais tout ce qu'elle fait remplace les fonctions qui contiennent les requêtes HTTP que je veux changer. Existe-t-il un moyen d'accrocher les requêtes HTTP en Java pour pouvoir les rediriger plus facilement? Un peu comme un proxy-wrapper. Clarification: L'application envoie une requête GET ou POST à ​​une URL. J'ai besoin que le contenu reste le même, il suffit de changer l'URL. Les redirections DNS ne fonctionneront pas, l'en-tête HTTP hôte doit être correct pour le nouveau serveur. PS: Ceci est une application de bureau, pas un script de serveur.Puis-je écrire une classe de loader Java qui va accrocher des requêtes HTTP dans la classe chargée?

Répondre

2

Une façon lourde mais fiable de le faire serait de rendre votre application utilise un serveur proxy, puis écrire un serveur proxy qui rend les changements dont vous avez besoin. Le serveur proxy peut être en cours de traitement dans votre application. il ne devrait pas être un programme distinct. Pour utiliser un proxy, définissez system properties - http.proxyHost et http.proxyPort. Les demandes effectuées via HttpURLConnection utiliseront ensuite ce proxy (sauf si elles remplacent spécifiquement les paramètres de proxy par défaut). Les demandes faites en utilisant une autre méthode comme Apache HttpClient ne seront, je pense, pas affectées, mais j'espère que toutes vos demandes utilisent HttpURLConnection.

Pour implémenter le proxy, si vous utilisez un Sun JRE, vous devez probablement utiliser le built-in HTTP server; mettre en place un seul gestionnaire mappé sur le chemin "/", ce qui va ramasser toutes les demandes envoyées par votre application, et peut ensuite déterminer la bonne URL pour les envoyer, et établir une connexion à cette URL (avec tous les droits en-têtes aussi). Pour établir la connexion, utilisez URL.openConnection(Proxy.NO_PROXY) pour éviter de faire une demande au proxy et ainsi être pris dans une boucle infinie. Vous devrez ensuite pomper l'entrée et la sortie entre les deux prises.

La seule autre façon que je peux penser à faire ceci serait de surcharger HttpURLConnection avec un nouveau gestionnaire qui dirige des demandes à votre destination désirée; vous devez trouver un moyen de persuader la classe URL d'utiliser votre gestionnaire au lieu de celui par défaut. Je ne sais pas comment tu ferais ça de façon propre.

+0

Je ne savais pas qu'il y avait des propriétés pour définir un proxy. Cela fonctionnera parfaitement pour ce que j'ai en tête. Merci. – download

0

Contrôlez-vous tout le code? Si oui, je suggère d'utiliser Dependency Injection pour injecter l'implémentation concrète que vous voulez, ce qui vous permettrait d'injecter à la place une classe proxy.

+0

Malheureusement non, et même si je l'ai fait, je ne veux pas mettre ma propre version du programme. Je veux mettre un chargeur qui peut rediriger n'importe quelle version du programme. – download

1

Alors qu'un post plus ancien, cela devrait donner quelques idées de certains types d'injections bytecode qui peuvent être traitées: Java Programming: Bytecode Injection. Un autre outil est Javassist et vous pourrez peut-être trouver des liens à partir de l'article wiki Aspected-oriented programming (voir la section sur les tisserands bytecode).

Il existe certains produits qui modifient de manière dynamique le code. En fonction de ce que l'on désire, il peut y avoir ... des méthodes moins douloureuses. Si vous voulez simplement "hooker" les requêtes HTTP, une autre option consiste simplement à utiliser un proxy (qui pourrait être un processus externe) et à passer par là. L'utilisation d'un proxy nécessiterait probablement un contrôle sur la résolution de noms utilisée.

+0

J'ai déjà un script de proxy en Python pour cela, mais je pensais que quelqu'un pourrait mieux connaître Java. – download

1

Vous pouvez utiliser des filtres de servlet qui interceptent les requêtes, les requêtes peuvent en outre être encapsulées, redirigées, transférées ou complétées à partir d'ici.

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

+0

J'ai eu la même idée, mais vous m'avez battu de 30 secondes. +1 –

+0

Je devrais avoir mentionné, ce n'est pas une application serveur JSP. Juste une application Java de bureau simple. – download

+0

@download: Dans ce cas, nous avons besoin d'une petite description sur le flux de la requête et ainsi de suite. PS, vous pouvez éditer votre message (question) pour inclure ces choses. –

0
  • Si vous pouvez modifier le code source, il suffit de changer et d'ajouter votre code supplémentaire sur chaque requête HTTP.

  • Si vous ne pouvez pas modifier le code source, mais qu'il utilise l'injection de dépendance, vous pouvez peut-être injecter quelque chose pour intercepter les demandes. Sinon, utilisez la programmation orientée aspect et attrapez la classe d'URL, ou tout ce que vous utilisez pour faire des requêtes HTTP. @AspectJ (http://www.eclipse.org/aspectj/doc/next/adk15notebook/ataspectj.html) est assez facile et puissant.