2013-07-29 7 views
0

J'ai le code ci-dessous qui code une URL avant qu'il ne soit envoyer sur le fil (e-mail):Encode Chaîne URL en Java

private static String urlFor(HttpServletRequest request, String code, String email, boolean forgot) { 
    try { 
     URI url = forgot 
      ? new URI(request.getScheme(), null, request.getServerName(), request.getServerPort(), createHtmlLink(), 
        "code="+code+"&email="+email+"&forgot=true", null) 
      : new URI(request.getScheme(), null, request.getServerName(), request.getServerPort(), createHtmlLink(), 
        "code="+code+"&email="+email, null); 
     String s = url.toString(); 
     return s; 
    } catch (URISyntaxException e) { 
     throw new RuntimeException(e); 
    } 
} 

/** 
* Create the part of the URL taking into consideration if 
* its running on dev mode or production 
* 
* @return 
*/ 
public static String createHtmlLink(){ 
    if (GAEUtils.isGaeProd()){ 
     return "/index.html#ConfirmRegisterPage;"; 
    } else { 
     return "/index.html?gwt.codesvr=127.0.0.1:9997#ConfirmRegisterPage;"; 
    } 
} 

Le problème est que l'e-mail généré ressemble à ceci:

http://127.0.0.1:8888/index.html%3Fgwt.codesvr=127.0.0.1:9997%23ConfirmRegisterPage;?code=fdc12e195d&[email protected] 

la marque ? et # symbole est remplacé par %3F et %23 où lorsque le lien est ouvert à partir du navigateur, il ne sera pas ouvert comme il est incorrect.

Quelle est la bonne façon de faire cela?

+0

Encode seulement les paramètres de la requête, pas le chemin segemts. –

Répondre

1

Vous devez combiner les parties de requête de l'URL et ajouter le fragment en tant que paramètre correct.

Quelque chose comme cela devrait fonctionner:

private static String urlFor(HttpServletRequest request, String code, String email, boolean forgot) { 
    try { 
     URI htmlLink = new URI(createHtmlLink()); 
     String query = htmlLink.getQuery(); 
     String fragment = htmlLink.getFragment(); 
     fragment += "code="+code+"&email="+email; 
     if(forgot){ 
      fragment += "&forgot=true"; 
     } 
     URI url = new URI(request.getScheme(), null, request.getServerName(), request.getServerPort(), htmlLink.getPath(), 
        query, fragment); 
     String s = url.toString(); 
     return s; 
    } catch (URISyntaxException e) { 
     throw new RuntimeException(e); 
    } 
} 
+0

Merci, je viens d'essayer votre code, mais la sortie ressemble à ceci: 'http://127.0.0.1:8888/index.html?gwt.codesvr=127.0.0.1:9997&code=4522ebee9f&[email protected]# ConfirmRegisterPage; 'il devrait être' http: //127.0.0.1: 8888/index.html? Gwt.codesvr = 127.0.0.1: 9997 # ConfirmRegisterPage; & code = 4522ebee9f & email = démo @ email.com' – xybrek

+0

@xybrek: Êtes-vous 100 % sûr de ça? Je suis sûr à 90% que le "& code = ... & email = ..." devrait aller dans la partie requête et non dans la partie fragment, mais si vous êtes sûr, ajoutez simplement le "& code ..." à htmlLink. getFragment() au lieu de htmlLink.getQuery(). –

+0

Ouais ... selon la documentation Errai: https://docs.jboss.org/author/display/ERRAI/Errai+UI+Navigation – xybrek