2008-10-08 6 views
3

J'écris une application Java qui accepte des valeurs de paramètres d'URL codées ou non. J'ai besoin d'un moyen facile de dire si j'ai besoin d'encoder la chaîne de paramètres.Comment savoir si un paramètre d'URL doit être codé en Java

En d'autres termes, je veux une fonction boolean needsEncoding(String param), qui retournera vrai si je passe dans la chaîne "[email protected]", et faux si je passe dans "foo% 40test.com". Le problème avec cette idée est que c'est ambigu. Comment saurais-je si le signe "%" dans la dernière chaîne devrait être encodé? Une façon de gérer cela est de modifier mon contrat - obliger les clients à passer des chaînes non codées pour que je sache que j'ai toujours besoin de les encoder. Pensées?

Répondre

6

Je pensais que je mettrais cela comme une proposition de réponse afin que les gens peuvent voter:

Une façon de gérer cela est de modifier mon contrat - demander aux clients de passer dans les chaînes non codée pour que je sais que je toujours besoin de les encoder.

+0

J'ai voté pour vous. Changer de contrat a du sens – anjanb

+0

Il est toujours préférable de ne pas deviner. – Rontologist

+0

Il est impossible de détecter si l'utilisateur souhaite foo% 40test.com ou [email protected] s'il définit foo% 40test.com. Changer le contrat. – Horcrux7

0

signe une chaîne a été encodée au format URL:

  1. Il n'y a pas d'espace, mais beaucoup de symboles et plus.
  2. Tous les signes de pourcentage sont suivis de deux chiffres.
  3. Il n'y a pas de caractères en dehors de a..b, A..B, 0..9, ".", "_", "-", "*", "%" et "+".

Cependant, je pense que la modification du contrat est l'action recommandée ici.

+0

Merci pour l'entrée. En regardant tout le code moche (et probablement peu fiable) que je devrais écrire pour le comprendre, je pense que vous avez raison de dire qu'il vaut mieux changer de contrat! – Julie

1

comment décoder la chaîne et vérifier si toutes les différences entre la chaîne originale et la chaîne décodée sont des entités url valides.

+0

Cela pourrait fonctionner. Pourriez-vous le débusquer un peu plus? Si je décodais "test% 40geek.com", j'obtiendrais "[email protected]" - comment comparer les deux? Avez-vous un extrait de code à l'esprit? – Julie

+0

Un algorithme simple n^2 diff devrait fonctionner: Utiliser deux pointeurs dans les chaînes, les comparer, et si elles correspondent, itérer les deux, sinon itérer celui de la chaîne la plus longue et sauvegarder (dans un tampon) le char. ce pointeur pointe vers. Quand ils correspondent à nouveau enregistrer votre tampon comme une différence si ce n'est pas == "" – rcreswick

+0

Semble comme une approche de programmation dynamique du problème. Donc, si je passe en "1 + 2" et déterminez que "+" a été décodé en "", que faire ensuite? Je ne sais toujours pas si c'est une chaîne pré-encodée, ou si je devrais vraiment encoder "+" en "% 2B". Je pense que le problème est insoluble. – Julie

0

Vous pouvez utiliser java.net.URLDecoder sur l'entrée et voir si elle change en comparant les valeurs de chaîne d'entrée et de sortie. En regardant le Javadocs pour URLDecoder, il décrit la logique métier qu'il applique sur une chaîne d'entrée pour déterminer si elle nécessite ou non le décodage d'URL.

Si vous devez obtenir un résultat boolean et ne veulent pas encourir les frais généraux de décodage a tenté d'obtenir ce résultat boolean, vous pouvez toujours se fissurer ouvrir le code source de la classe URLDecoder et utiliser la même logique métier qu'il utilise pour déterminer si le décodage d'URL est nécessaire.

+0

En regardant le javadoc, si je passais en "1 + 2" à ma méthode booléenne, URLDecoder retournerait "1 2". Je ne peux toujours pas dire si le client veut dire que la chaîne "1 + 2" devrait être encodée, ou si c'est juste "1 2" qui a déjà été encodé. – Julie

0

Voici ma méthode normale pour faire face à cela. Tout d'abord, puisque + est un cas spécial agaçant, je l'interdis dans le cadre de l'encodage. Si elles mettent un plus, c'est un plus, si elles veulent un espace, elles peuvent appuyer sur cette grande barre au bas de leur clavier. (Et oui, j'ai fait cela dans le cadre de certains contrats). Mais vraiment, vous pouvez l'expliquer en travaillant si dur pour votre client qu'il n'a pas besoin de s'inquiéter de l'encoder lui-même.

Ensuite, j'ai réécrit java.net.URLDecoder.decode pour supprimer le cas «+». (Vraiment juste une question de couper et coller dans n'importe quelle classe d'utilité que j'utilise pour ce projet, et enlever ~ 4 lignes).

Ensuite, pour tout ce que je reçois, je le fais passer par le décodeur, puis l'encodeur. Cela va le décoder et le réencoder s'il est codé, ou l'encoder s'il n'est pas codé. J'ai reçu cette astuce de quelqu'un il y a quelques années, je ne me souviens pas qui donner un crédit approprié.

Alors je me retrouve avec:

String properlyencodedstring = 
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8"); 

Le seul moment où cela peut avoir besoin de peaufinage serait dans le cas de données avec de grands groupes de urls devant être saisies et traitées, est que je passe mon hypothèse , utilisez input type="url" (avec une sorte de polyfill javascript pour les anciens navigateurs), et prétraitez avec .replaceAll("+", " "), car il n'y aurait pas d'espaces autorisés à entrer dans ce cas. (Et selon toute vraisemblance, utilisez java.net.URI à la place de toute façon)

Questions connexes