2009-06-19 4 views
3

나는 사람의 성을 가진 객체 필드가 ​​있습니다. 내가 $ {person.lastName}를 사용하는 경우C :를 사용하여 아포스트로피를 이스케이프 처리합니다. out JSP

, 내가

<c:out value="${person.lastName}"/> 

를 사용하는 경우 오브라이언

얻을 나는 O ' 브라이언

두 출력은 나누기 얻을 IE의 다음 jsp 코드

<a href="#" 
    class="delete" 
    onclick="if(confirm('<c:out value="${application.lastName}"/> ' + _('Are you sure you want to delete this application?'))) {deleteApplication('${application.identifier}')};return false;"><bean:message key="application.delete"/></a> 

onclick="if(confirm('O&#039;Brian ' 

또는

onclick="if(confirm('O'Brian ' 

로 변환됩니다 때문에 0

나는 어떻게 해결하는 '브라이언

에게 오브라이언O의 \로 이스케이프 할 어떤 생각을해야합니다 이 문제?

해결책

가장 우아한 해결책은 간단한 태그를 사용하는 것 같습니다.

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> 
<taglib> 
    <tlibversion>1.2</tlibversion> 
    <jspversion>1.1</jspversion> 
    <shortname>bean</shortname><uri>utilsTags</uri> 
    <uri>utilsTags</uri> 
    <tag> 
     <name>escapeJS</name> 
     <tagclass>view.EscapeJS</tagclass> 
     <bodycontent>scriptless</bodycontent> 
     <attribute> 
      <name>str</name> 
      <required>true</required>  
      <rtexprvalue>true</rtexprvalue> 
     </attribute>     
    </tag>  
</taglib> 

그런 다음 JSP 내부 : 데이터베이스의 오브라이언과 같은

<%@ taglib prefix="utils" uri="utilsTags" %> 

<utils:escapeJS str="${application.firstName}"/> 
+1

아포스트로피에서 벗어나는 것은 불충분합니다. 백 슬래시 '\ n','\ r'도 이스케이프해야합니다. 및'\ ". 이스케이프 된 문자열이 사용자가 제어 할 수있는 경우 보안 구멍이 열리 며 '\'와 같은 이스케이프 문자를 이스케이프 처리 할 수 ​​있습니다. my_script(); ' – rustyx

답변

1

스토어를하지만, 전에

package view; 

import java.io.IOException; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.tagext.SimpleTagSupport; 

public class EscapeJS extends SimpleTagSupport { 
    public String str; 

    public void doTag() throws JspException, IOException { 
     getJspContext().getOut().print(str.replaceAll("\'", "\\\\'")); 
    } 

    public String getStr() { 
     return str; 
    } 

    public void setStr(String str) { 
     this.str = str; 
    } 

} 

그런 다음 WEB-INF에 utils.tld 파일을 저장 그것을 표시하면 찾을 수 있습니다. 'to \'로 변환하십시오.

+0

O'Brian으로 값을 저장하려고합니다. O'Brian이 O'Brian이 아니기 때문에 디스플레이 할 때가 대부분입니다. –

+0

업데이트 된 답변은 값을 표시하기 전에 'to \'를 대체해야 할 것처럼 보입니다. – Jared

3

문자열을 이스케이프 처리하는 새로운 EL 함수를 정의 할 수 있습니다.

예. 태그 라이브러리 설명자 파일에서

public class MyStringUtil { 
    public static String escapeJs(String str) 
    { 
    // escape the string (e.g. replace ' with \') 
    } 
} 

자바

에서

: 당신의 JSP에 다음

<function> 
<name>escapeJs</name> 
<function-class>package.to.MyStringUtil</function-class> 
<function-signature> 
    java.lang.String escapeJs(java.lang.String) 
</function-signature> 
</function> 

(당신이 포함 한 가정하여 .tldfoo의 접두어 :

<a href="#" 
    class="delete" 
    onclick="if(confirm('${foo:escapeJs(person.lastName)}' + _('Are you sure you want to delete this application?'))) {deleteApplication('${application.identifier}')};return false;"><bean:message key="application.delete"/></a> 
관련 문제