2011-02-19 12 views
32

JSTL ile URL yolunu (parametre talep etmiyor) temsil eden bir String URL'sini kodlamanın en iyi yolu nedir?JSTL ile URL yolunu temsil eden bir String nasıl kodlanır?

<c:url value="/user/${user.name}"/> 

any documentation I find göre bu icabına gerekir. Ama öyle değil. Parametreleri güzelce kodlar (<c:url value="/user/${user.name}"><c:param name="section" value="employment 4u so good"/></c:url>) ancak hiçbir parametreyi geçemiyorum. ${user.name}'un ne olabileceğinden korkmadan, yukarıdaki gibi basit bir URL'yi nasıl güvenli bir şekilde kodlayabilirim?

cevap

51

<c:url>, URI değerini belirtilen şekilde değil, yalnızca iç içe geçmiş bir <c:param> ile belirtilen URL isteği parametrelerini kodlamaz. Bağladığınız IBM makalesi, aksi belirtilmiyor. “URL yeniden yazımı” ile karıştırdığınıza inanıyorum (ki bu da gerekli olduğunda jsessionid'e ekleyeceğinden başka bir şey değil).

Gereksiniminizi karşılamak için, en iyi, URLEncoder#encode()'a delege veren ve sonuç uyumu URI kurallarını değiştiren özel bir EL işlevi oluşturmaktır.

<a href="/user/${util:encodeURI(user.name)}">view profile</a> 

this answer 2. bölümünde

public static String encodeURI(String value) throws UnsupportedEncodingException { 
    return URLEncoder.encode(value, "UTF-8") 
     .replace("+", "%20") 
     .replace("%21", "!") 
     .replace("%27", "'") 
     .replace("%28", "(") 
     .replace("%29", ")") 
     .replace("%7E", "~"); 
} 

ile nasıl beyan ve özel EL işlevleri kaydetmek için bir temel başlama örnek bulabilirsiniz.

+1

Teşekkürler, Balus C. Ben şu anda yapıyorum. Yapılmış bir şey olduğunu umuyorum ama bu en iyi yol ise o zaman öyle olsun. –

+16

Merakla yeterli URLEncoder.encode() aslında bir URL'yi kodlamak için doğru yol değildir. Bir URL * parametresini kodlamak için doğru yoldur. * Örneğin boşlukları + olarak değiştirir. Doğru teknik, örneğin boşlukları% 20'ye değiştiren yeni URI (null, url, null) .ASASCIIString() 'dir. – EJP

+1

Son bağlantınızdaki soru silinmiş görünüyor ve sadece 10k + kullanıcılar tarafından görüntülenebilir. –

5

Bunun alternatif bir çözüm olduğunu zaten biliyorsunuzdur, fakat özel kullanımım için en zarif çözümün bir istek niteliği kullanmak olduğuna karar verdim.

req.setAttribute("myUrl", URLEncoder.encode(myUrl, "UTF-8")); 

ve benim JSP: Yani benim servlet'dir

"...${myUrl}" 
+0

Bu yanlış. Bkz. [EJP'nin yorumu] (http://stackoverflow.com/questions/5053975/how-to-url-encode-a-string-with-jstl#comment8244110_5064758). –

1

Bir encodeUrl etiketi vardır jakarta dize TagLib, kullanabilirsiniz: http://jakarta.apache.org/taglibs/doc/string-doc/string-1.1.0/index.html#encodeUrl

Takip web uygulamanızı bu etiket kitaplığı ile yapılandırmak için şu adımları izleyin:

  1. Etiket kitaplığı tanımlayıcı dosyasını web uygulamanızın/WEB-INF alt dizinine kopyalayın.
  2. JAR dosyası etiket kütüphanesini web uygulamanızın/WEB-INF/lib alt dizinine kopyalayın.

JSP sayfalarında bu kitaplıktan etiketlerini kullanın aşağıdaki yönergeyi eklemek için yukarıdaki bağlantıda söylediği gibi

  • /WEB-INF/web.xml, web uygulama dağıtım tanımlayıcı bir öğesi ekleyin her sayfanın:

    <a href="str:decodeUrl>${URL}</str:decodeUrl)"/> 
    
  • +11

    Tüm Jakarta taglib sayfalarının üstünde büyük bir kırmızı uyarı kutusu var, "* 2010-04-14 - Jakarta Taglibs emekli oldu." * Bu sadece dekorasyon için değil. Artık kullanmamalısın. – BalusC

    0

    bu şekilde sade tutun::

    <%= java.net.URLEncoder.encode(request.getAttribute("user.name").toString() , "UTF-8") %> 
    
    aşağıda

    jsp kullanım örneğidir

    +1

    Eh, bu basit, basit tutmaktır. –

    +0

    Benim için yapıştırmaya ihtiyacım olan yere yapıştırın, basittir. Kolay, daha az karakter kullanabilir. –

    +0

    Bu yanlış. Bkz. [EJP'nin yorumu] (http://stackoverflow.com/questions/5053975/how-to-url-encode-a-string-with-jstl#comment8244110_5064758). –

    İlgili konular