2010-09-13 10 views
1

Traditionnellement, nous avons toujours utilisé xml dans la réponse qui est analysée par une méthode Javascript pour exécuter des processus de post-traitement. Je suis venu avec une nouvelle implémentation plus simple qui utilise un ensemble d'entrée caché par un requestAttribute et exécuté dans un callback ajax.Question sur l'exécution des post-processus javascript dans l'application Java

JSP:

<% 
    String jsPostProcess = (String)request.getAttribute("jsPostProcess"); 
    if (jsPostProcess!=null && jsPostProcess.trim().length()>0){   
%> 
     <input type="hidden" id="jsPostProcess" name="jsPostProcess" 
      value="<%= jsPostProcess %> "/> 
<% } %> 

AJAX callback:

var callback = { 
    success: function(response) { 
     var div = $(divId); 
     if (div){ 
      div.innerHTML = response.responseText;    
     } 
     var jsPostProcess = $('jsPostProcess'); 
     if (jsPostProcess) 
      eval(jsPostProcess.value); 
    }, 
    failure: function(response) { 
     alert('Something went wrong!'); 
    } 
} 

CODE Servlet:

request.setAttribute("jsPostProcess", jsPostProcess); 

Il fonctionne à merveille, et il est tellement plus simple pour ajouter js processus post pratiquement n'importe quel appel, peu importe la simplicité ou la complexité de la fonctionnalité. Pas besoin de méthodes js personnalisées pour l'analyse.

Curieux si quelqu'un pouvait identifier des problèmes potentiels avec lui (tels que des problèmes de sécurité?) Ou faire des suggestions pour d'autres alternatives. Nous utilisons actuellement Prototype et YUI 2 sur le front-end.

Répondre

1

Tout d'abord, il n'y a pas besoin de ce code de scriptlet désagréable:

<c:if test='${not empty jsPostProcess}'> 
    <input type='hidden' id='jsPostProcess' name='jsPostProcess' value='${jsPostProcess}'> 
</c:if> 

La prochaine chose est que j'espère que quelque part avant ce point la valeur « jsPostProcess » a été nettoyée afin qu'il ne casse pas le balisage (comme, au cas où il comprend des citations). Il suffit d'appeler eval() sur la valeur comme cela semble un peu dangereux, bien que peut-être vous savez très bien ce que ça va être.

Enfin, je suggère que si le code "post-traitement" n'est pas trop grand, vous pouvez le renvoyer dans un en-tête de réponse. Alors vous ne devriez pas laisser tomber n'importe quel balisage sans signification dans votre page.

Oh, aussi enfin: vous pourriez vouloir désactiver le <input>. Ou, alternativement, vous ne devez pas même utiliser une entrée: vous pouvez utiliser cette astuce:

<script id='jsPostProcess' type='text/plain'> 
    ${jsPostProcess} 
</script> 

L'attribut « type » est « text/plain » les navigateurs ne pas essayer d'exécuter ce code , et vous pouvez obtenir le "texte" de l'élément <script> quand vous le voulez.

+0

Merci pour la réponse !! Une fois que j'ai relu votre message quelques fois j'ai tout eu pour travailler (malgré mon commentaire précédent que j'ai édité lol !!). Excellentes suggestions. Très appréciée! – skel625

+0

"Appeler simplement eval() sur la valeur comme ça semble un peu dangereux, même si vous savez peut-être bien ce que ça va être." Je pensais la même chose, mais je ne voyais pas comment cela pourrait être utilisé avec malveillance, car les post-processus sont tous des événements assez standard qui ne permettent pas plus de «hack-ability» que ce qui est normalement possible par l'utilisateur . Mais je ne suis pas un expert sur les questions de sécurité js !! ;) – skel625

+0

Eh bien, tant que ce contenu n'a pas de contenu fourni par l'utilisateur, vous êtes OK. Si c'est le cas, alors il y a des façons de vous protéger là aussi. – Pointy