2009-09-24 21 views
33

Ho un modulo utente. Se l'utente digita una stringa con ' o " come parte di esso, non ho alcun problema. Il modulo viene inviato e salvato correttamente nel database. Il mio problema è quando ricarico la pagina (tutte le voci possono essere modificate e caricate in un elenco nel JSP prima di essere visualizzate). Sul caricamento della pagina ottengo un errore che dice:Come sfuggire apostrofo o virgolette su JSP (utilizzato da JavaScript)

missing) after argument list 'Caroline's message', \n 

Che cosa devo fare per uscire da questa stringa per la visualizzazione sul frontend?

Ecco il codice che sto usando sul frontend per leggere i dati e memorizzarli in un oggetto JavaScript. Non sono completamente sicuro di dove sia necessario fuggire. Il campo causa il problema è c.getComName:

communications[<%=i%>][1] = new CommObject('<%=c.getComId()%>', '<%=c.getComName()%>'); 

aggiornato con HTML generato:

communications[0][1] = new CommObject('101', 'Caroline's Message'); 
+0

Cosa intendi per incasinato? In che modo questi personaggi sono incasinati? – Gumbo

+0

Siamo spiacenti, ulteriori indagini hanno rivelato che il mio problema non è nell'inviare il modulo ma nel recuperare nuovamente i dati dopo l'invio, vedere la domanda aggiornata – Caroline

+0

Puoi mostrare l'HTML generato? –

risposta

21

Utilizzare la funzione Apache StringEscapeUtils.escapeJavaScript.

Escapes the characters in a String using JavaScript String rules. 

Escapes any values it finds into their JavaScript String form. 
Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) 

So a tab becomes the characters '\\' and 't'. 
+0

Grazie Kevin, funziona perfettamente! – Caroline

+0

Inoltre, se questa stringa è un URL (ad esempio javascript: launchURL (<% = c.getComUrl()%>) puoi combinare è StringEscapeUtils.escapeJavaScript con URLEncoder.encode per produrre un URL javascript-safe. – piepera

+9

Basta notare che questo è stato modificato in 'StringEscapeUtils.escapeEcmaScript (String)' in common lang 3.x + – rcl

-1

Questo è strano.

Che dire:

'<%=c.getComName().replaceAll("\\'","\\\\'")%>' 

Se funziona, devi solo capire come aggiungere il \ invece "

+0

Ci proverò ma ho il sospetto che funzionerà per "ma non per" – Caroline

+0

in realtà non lo risolve che è una sorpresa per me! – Caroline

+0

: -o Immagino che avrai bisogno di pre-elaborare il nome prima di consegnarlo :( – OscarRyz

0

Quando ritorni il codice HTML dalla classe CommObject aggiungere nella \". del 'e prima del nome (ad esempio il messaggio di Caroline)

In questo modo: return "\" "+ comName +" \ "";

+0

Proverò questo ora, grazie – Caroline

+0

Ancora nessuna gioia, mi manca) dopo la lista degli argomenti '"Messaggio di Caroline"', \ n. Giusto per confermare ho bisogno di scappare entrambi 'e " – Caroline

+0

No, basta scappare", e tralasciare la virgoletta singola – amischiefr

45

preferisco evitare scriptlet nel mezzo della mia pagina e stavo avendo ad usarli (sempre più spesso) per sfuggire stringhe quando viene utilizzato in codice JavaScript. Volevo un modo Expression Language (EL) di sfuggire alle stringhe. Ho creato un piccolo taglib personalizzati che uso per questo scopo:

Utilities.java:

package com.mycom.taglibs; 

import org.apache.commons.lang.StringEscapeUtils; 

public class Utilities { 
    public static String escapeJS(String value) { 
     return StringEscapeUtils.escapeJavaScript(value); 
    } 
} 

mytaglib.tld:

<?xml version="1.0" encoding="UTF-8" ?> 
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 
version="2.0"> 

    <description>My Tag Library</description> 
    <display-name>Tag Utils</display-name> 
    <tlib-version>1.1</tlib-version> 
    <short-name>myt</short-name> 

    <function> 
    <description> 
     JavaScript Escape function 
    </description> 
    <name>escapeJS</name> 
    <function-class>com.mycom.taglibs.Utilities</function-class> 
    <function-signature>java.lang.String escapeJS(java.lang.String)</function-signature> 
    </function> 
</taglib> 

E, nel Pagina JSP:

<%@ taglib prefix="myt" uri="/WEB-INF/mytaglib.tld" %> 
The escaped string is: ${myt:escapeJS(variableHoldingTheString)} 
+10

Grazie, questo è un buon consiglio :) Vorrei solo aggiungere che non hai bisogno della classe Utilities.java. È possibile costruire il taglib direttamente con StringEscapeUtils in questo modo: org.apache.commons.lang.StringEscapeUtils java.lang.String escapeJavaScript (java.lang.String) machinery

-2

Si potrebbe utilizzare i tag fondamentali JSP:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
var jsVar = "<c:out value='${stringVariable}' />"; 
+4

Esiste una differenza tra l'escape del testo per Javascript e per HTML/XML. La tua risposta affronta quest'ultima, ma questa domanda stava chiedendo la prima. Perché c: out genererà entità HTML/XML che non sempre funzionano nel codice JS. – nickdos

+0

Sarai in grado di rompere il contesto js: "è estremamente facile passare a un contesto di esecuzione con caratteri che includono (ma non limitati a) punti e virgola, uguali, spazio, più e molti altri, quindi usa con cautela." da https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet – Tarion

0

È possibile utilizzare la funzione di fuga JSTL fn:escapeXml() per sbarazzarsi di anomalie dovute a causa di virgolette singole (`). L'esempio seguente dimostra la differenza.

Ad esempio:

<c:set var="string1" value="This is abc's first String."/> 
<c:set var="string2" value="This is abc's second String."/> 

<p>With escapeXml() Function:</p> 
<p>string (1): ${fn:escapeXml(string1)}</p> 

<p>Without escapeXml() Function:</p> 
<p>string (2): ${fn:escapeXml(string2)}</p> 

RESULT

stringa (1): Questo è abc s prima stringa.

string (2): Questa è la seconda stringa di abc.

+2

Nella stringa 'Without escapeXml()', si chiama 'escapeXml' ... –

3

fn: escapeXml non funziona in JavaScript. Sostituisce "con # & 0039; causa ancora un errore durante l'esecuzione di JavaScript.

Solo sfuggire nel modo JavaScript è corretta: \'

La funzione di Apache StringEscapeUtils.escapeJavaScript fa per voi. Creare un taglietto per questo semplifica enormemente le cose.

0

anche noi abbiamo molto bella soluzione a partire dalla primavera:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
 

 
<spring:message code="${propertyName}" javaScriptEscape="true"/>

Quindi, problema dalla questione di questo post può essere risolto in questo modo:

communications[<%=i%>][1] = new CommObject('<spring:message code="${c.comId}" javaScriptEscape="true"/>', '<spring:message code="${c.comName}" javaScriptEscape="true"/> <%=c.getComName()%>');

Problemi correlati