Maison  >  Article  >  interface Web  >  Comment Js utilise-t-il l'URL pour transmettre des paramètres chinois tronqués en arrière-plan ?

Comment Js utilise-t-il l'URL pour transmettre des paramètres chinois tronqués en arrière-plan ?

一个新手
一个新手original
2017-09-22 10:23:432179parcourir

Nous utilisons souvent cette URL dans l'URL pour transmettre des paramètres au backend lorsque le frontend demande l'URL correspondante dans le backend. Cependant, si les paramètres sont en chinois, il y aura des problèmes tronqués. Considérons un scénario pour expliquer en détail la solution aux caractères tronqués lors de la transmission de paramètres dans l'URL.


Supposons que nous ayons une zone de saisie et un bouton de soumission sur notre page. Lorsque nous cliquons sur le bouton de soumission, nous obtenons la saisie de l'utilisateur. dans la valeur de la zone de saisie, puis utilisez l'URL pour transmettre les paramètres afin de transmettre la valeur de la zone de saisie à l'arrière-plan. Nous supposons que l'arrière-plan correspondant à la technologie de traitement de la couche Web utilise l'action Struts2 pour le traitement des données, en supposant que l'URL des données traitées dans l'action est /say. Le code d'action de demande urgente de page spécifique est le suivant :

Code HTML :


<input type="text" id="name" name="name" value="${user.name}" />
<button id="sub" onclick="sub()">提交</button>
javascript代码:
<script type="text/javascript">
function sub(){
var name = document.getElementById("name").value;①
 window.location = "sayHello?user.name=" + name;②
}
</script>

Le code ci-dessus obtient d'abord la zone de saisie à partir de la zone de saisie avec l'identifiant de la valeur du nom, puis utilisez window.localtion pour demander l'action dont l'URL est sayHello. Après cette action, utilisez le format key=value pour transmettre les paramètres et utilisez la valeur dans la zone de saisie selon Struts2. mécanisme pour mettre à jour l'utilisateur d'arrière-plan. L'attribut name de l'entité .

Principe d'encodage et de décodage des URL :

Car la façon dont nous utilisons l'URL pour transmettre les paramètres dépend de l'environnement du navigateur, c'est-à-dire de l'URL et de chaque format clé=valeur contenu dans l'URL Les paramètres de paire clé-valeur des paramètres transmis sont traités par le principe de traitement dans la barre d'adresse du navigateur, puis transmis à l'arrière-plan pour décodage après traitement du codage correspondant.

Comme nous n'avons effectué aucun traitement, lorsque JavaScript demande l'URL et transmet les paramètres en chinois (c'est-à-dire lorsque le chinois est saisi dans la zone de saisie), les paramètres chinois de l'URL sont codés selon le mécanisme de navigateur de. À l’heure actuelle, il y a un problème d’encodage tronqué.

Supposons que le contenu saisi dans la zone de saisie est le mot "test" et que la valeur du paramètre reçue par l'action en arrière-plan est tronquée. Utilisez la méthode encodeURI() pour encoder en javascript.

1. Lorsque vous utilisez encodeURI() pour encoder les paramètres d'URL chinois en javascript, le mot "test" sera converti en "%E6%B5%8B%E8%AF%95"

2. Cependant, le mécanisme du navigateur considérera "%" comme un caractère d'échappement, et le navigateur traitera et transmettra les caractères d'échappement entre les paramètres convertis "%" et "%" transmis dans l'URL de la barre d'adresse à l'action en arrière-plan. Cela entraînera une incohérence avec l'URL réelle codée par encodeURI(), car le navigateur croit à tort que "%" est un caractère d'échappement et ne considère pas "%" comme un caractère ordinaire.

3. Pour que l'URL convertie par encodeURI() soit traitée normalement par le navigateur, elle doit être à nouveau traitée par encodeURI() dans le couche externe.>RUL codé par encodeURI(). Ce traitement encodeURI() réencodera le "%" dans l'URL codée qui est analysée comme caractère d'échappement par le navigateur et le convertira en caractère normal.

4. Après un traitement normal, le code en ② dans le code javascript précédent est :

window.location = encodeURI(encodeURI("sayHello?user.name=" + nom));

5. L'URL traitée n'est plus une chaîne convertie par encodeURI()"%E6%B5%8B%E8%AF%95", mais la chaîne après le traitement de l'URL a été traitée par la double couche précédente encodeURI()" %25E6%B255%258B%25E8%AF%2595", en ré-encodant le "%" original qui a été analysé comme caractère d'échappement lors de la navigation, il a été ré-encodé et converti en un caractère ordinaire et converti en "%25".

À ce stade, le code javascript frontal a terminé l'encodage de l'URL avec des caractères chinois et a transmis les paramètres via l'URL à l'action d'arrière-plan pour attendre le traitement. conversion normale sans caractères tronqués. Le paramètre est "%25E6%B255%258B%25E8%AF%2595". exactement le "test" que nous avons entré.

Action ne peut pas traiter une telle chaîne car il ne s'agit pas de la donnée source "test" entrée par notre front-end, mais a été codée deux fois par la chaîne encodeURI(). Nous devons donc utiliser une API dans le backend pour décoder la chaîne de paramètres codée par le front-end. L'API de décodage correspondante est URLDecoder.decode(user.getName(), "UTF-8").

La méthode decode(String str, String ecn) d'URLDecoder a deux paramètres Le premier paramètre est la chaîne à décoder, et le deuxième paramètre est l'encodage correspondant lors du décodage. Le code que nous utilisons pour décoder à l'aide de cette API en arrière-plan est :

URLDecoder.decode(user.getName(),"UTF-8");

Résumé :

À ce stade, nous avons résolu le problème des paramètres chinois tronqués dans l'URL. Les étapes du résumé sont grossièrement divisées en les étapes suivantes : <.>

1. Utilisez encodeURI() pour encoder deux fois les paramètres chinois dans l'URL en javascript

2. Obtenez la progression dans le background Front-end chaîne encodée encodeURI(), utilisez decode(String str, String ecn) méthode pour décoder

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn