web-dev-qa-db-fra.com

Comment obtenir seulement une partie de l'URL de HttpServletRequest?

À partir de l'URL suivante, je dois obtenir (http://localhost:9090/dts) seul.
C'est-à-dire que je dois supprimer (documents/savedoc) (OU)
besoin d'obtenir seulement - (http://localhost:9090/dts)

http://localhost:9090/dts/documents/savedoc  

Y a-t-il une méthode disponible dans la demande pour obtenir ce qui précède?

J'ai essayé ce qui suit et j'ai obtenu le résultat. Mais toujours en train d'essayer.

System.out.println("URL****************"+request.getRequestURL().toString());  
System.out.println("URI****************"+request.getRequestURI().toString());
System.out.println("ContextPath****************"+request.getContextPath().toString());

URL****************http://localhost:9090/dts/documents/savedoc  
URI****************/dts/documents/savedoc  
ContextPath****************/dts

Quelqu'un peut-il m'aider à résoudre ce problème?

17
user1732653

AFAIK pour cela, il n'y a pas de méthode fournie par l'API, besoin de personnalisation.

String serverName = request.getServerName();
int portNumber = request.getServerPort();
String contextPath = request.getContextPath();

// essaye ça

System.out.println(serverName + ":" +portNumber + contextPath );
13
NPKR

Vous dites que vous voulez obtenir exactement:

http://localhost:9090/dts

Dans votre cas, la chaîne ci-dessus se compose de:
1) schéma : http
2) serveur Nom d'hôte: localhost
3) serveur port: 9090
4) ( chemin de contexte : dts

(Vous trouverez plus d'informations sur les éléments d'un chemin de demande dans le manuel officiel Oracle Tutoriel Java EE: Obtention d'informations à partir des demandes )

Première variante:

String scheme = request.getScheme();
String serverName = request.getServerName();
int serverPort = request.getServerPort();
String contextPath = request.getContextPath();  // includes leading forward slash

String resultPath = scheme + "://" + serverName + ":" + serverPort + contextPath;
System.out.println("Result path: " + resultPath);


Deuxième variante:

String scheme = request.getScheme();
String Host = request.getHeader("Host");        // includes server name and server port
String contextPath = request.getContextPath();  // includes leading forward slash

String resultPath = scheme + "://" + Host + contextPath;
System.out.println("Result path: " + resultPath);

Les deux variantes vous donneront ce que vous vouliez: http://localhost:9090/dts

Bien sûr, il existe d'autres variantes, comme d'autres l'ont déjà écrit ...

C'est juste dans votre question initiale que vous avez demandé comment obtenir http://localhost:9090/dts, c'est-à-dire que vous voulez que votre chemin d'accès inclue le schéma .

Si vous n'avez toujours pas besoin d'un schéma, la méthode la plus rapide est la suivante:

String resultPath = request.getHeader("Host") + request.getContextPath();

Et vous obtiendrez (dans votre cas): localhost:9090/dts

35
informatik01

Supprimez simplement l'URI de l'URL, puis ajoutez-y le chemin de contexte. Pas besoin de manipuler des schémas et des ports lâches, ce qui n'est que plus fastidieux lorsque vous traitez avec le port par défaut 80 qui n'a pas du tout besoin d'apparaître dans l'URL.

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String ctx = request.getContextPath();
String base = url.substring(0, url.length() - uri.length() + ctx.length());
// ...

Voir également:

12
BalusC

À ma connaissance, vous avez uniquement besoin de la partie domaine et du chemin de contexte. Sur la base de cette compréhension, vous pouvez utiliser cette méthode pour obtenir la chaîne requise.

String domain = request.getRequestURL().toString();
String cpath = request.getContextPath().toString();

String tString = domain.subString(0, domain.indexOf(cpath));

tString = tString + cpath;
1
pratikch