2009-08-29 4 views
1

J'ai une application Web Java qui gère les données de nombreux clubs. Je voudrais que l'application affiche des informations de club en fonction de l'URL qui est tapée.Puis-je intercepter et modifier l'URL de requête d'un HTTPServletRequest dans un filtre Java Servlet?

Par exemple. Si vous entrez "localhost: 8080/MyApp/Club1" ... alors l'application devrait enlever la fin de l'URL de requst (Club1), faire une recherche dans la base de données pour le club, et l'ajouter à la session. Ensuite, toutes les demandes de base de données peuvent rechercher des données en fonction du club présent dans la session.

Si vous entrez « localhost: 8080/MyApp/Club2 », vous obtenez club enregistré dans la session, et toutes les demandes de base de données pour le club 2.

La façon dont je pensais que je peux faire est d'utiliser un filtre de servlet qui appelle HTTPServletRequest(). getRequestURL(), et supprime le nom du club de l'url de la requête, pour rechercher le club dans la base de données.

Mais alors je ne veux pas changer l'URL de la requête pour qu'elle soit http://localhost:8080/MyApp afin que l'application fonctionne normalement. Cependant, je ne pense pas que je suis capable de faire cela?

Quelqu'un at-il des idées sur la façon de le faire, ou s'il y a une meilleure approche?

Répondre

2

Je ne pense pas qu'un filtre soit la bonne façon de le faire. Ce que vous décrivez à propos du changement de comportement basé sur l'appartenance à un club est une logique qui appartient à votre couche de service, où elle peut être réutilisée.

Une meilleure façon de le faire serait d'oublier les filtres et de simplement programmer votre servlet. Passez le nom du club en tant que paramètre, utilisez-le pour faire une recherche dans une carte de l'URL de ce club, et demandez à votre servlet d'utiliser RequestDispatcher pour rediriger vers l'URL de ce club. Je ne vois aucun avantage à l'intercepter un battement de coeur plus tôt avec un filtre.

Si vous utilisiez Spring, je vous recommande de le mettre dans votre service et de laisser le niveau MVC Web gérer le mappage et le routage des demandes.

C'est l'un de ces cas où, si c'est trop difficile et compliqué de faire ce que vous voulez, vous essayez probablement la mauvaise chose. Il existe des moyens plus simples de le faire, et les filtres ne sont même pas proches.

0

Core J2EE Patterns - Intercepting Filter

RÉSUMÉ: créer des filtres enfichables à procédé services communs de manière standard sans avoir à modifier le code noyau de traitement de demande. Les filtres interceptent les demandes entrantes et les réponses sortantes, permettant le prétraitement et le post-traitement. Nous sont en mesure d'ajouter et de supprimer ces filtres discrètement, sans nécessitant des modifications à notre existant code.

+0

Merci pour cela. Des idées sur la meilleure façon de le faire? –

+1

Bien sûr, mais ces filtres font des choses comme la journalisation, l'ajout ou la modification de paramètres, et non la redirection vers des URL différentes. Je n'ai pas pu trouver un exemple de filtre qui a fait une telle chose. – duffymo

+0

Merci. Il semble que je sois hors de la marque en utilisant des filtres, donc je devrais abandonner cette approche. Je ne suis toujours pas sûr de la meilleure façon de le faire. Je pense que le problème se résume à cela vraiment. Je sais que je peux easly charger les données du club si les types d'utilisateurs dans: localhost/myApp Club = myClub C'est juste un cas d'obtenir le paramètre de demande dès que la demande arrive, puis obtenir le club de la base de données. Je ne semble pas avoir trouvé un moyen de faire exactement la même chose, mais obtenir le nom du club à partir du chemin, plutôt que comme un paramètre de demande. –

0

Dans votre de servlet do_GET/do_POST, vous pouvez interpréter la première partie de l'URI en tant que club, l'ajouter à la session (en utilisant champ d'application) si elle est pas déjà, puis déléguer à tout autre code que seuls regards au reste de l'URI et utilise le club en session, le cas échéant.

1

Jetez un oeil à urlrewritefilter. C'est un filtre de servlet qui peut modifier l'URL de la requête avant que votre servlet ne le voit. Il est souvent utilisé pour transformer les paramètres de requête en paramètres de chemin.

Si vous Google pour, vous le verrez venir dans la pile-traces de certaines applications Java assez médiatisés :)

+0

Ce filtre de servlet ne passera pas le traitement des requêtes au prochain filtre de servlet en chaîne, mais transférer immédiatement la requête au servlet. Cela pourrait être un problème. –

Questions connexes