27 Ocak 2010 Çarşamba

UrlReWrite ile UTF-8 problemi yaşamak...

Java'da arama motoru dostu URL yapmak istiyorsanız mutlaka bir uğramışsınızdır Url Rewrite Filter  adresine.


Problem: Tomcat suncusunda server.xml dosyasında CONNECTOR, HOST etiketlerine URIEncoding="UTF-8" eklendiği halde URLlerde UTF-8 problemi yaşadım.

Eğer bir formdan bilgi göndereceksiniz ve mesela TR karekterler içeriyorsa JSP dosyasının içine bozuk geliyorlardı.

Url Rewriter filtresini kaldırınca sorun ortadan kayboluyor, filre aktif olunca bu sorun geri geliyordu.

Çözüm: Tuckey.org adresinden kaynak kodlarını indirdim. Derleyip hata ayıklama biçiminde çalıştırdım. Url Rewrite filtesinin içine doFilter fonksiyonun ilk satırlarına request ve response setEncoding("UTF-8") ekledim. Ve sorun kayboldu.

Fakat bunun başka bir yolu daha olduğunu gördüm. Bu sebeple bir filtre yazdım ve adına UTF8Filtresi dedim. Web.xml dosyasında - contexte ait web.xml - ilk sıraya ekledim. Bu filtre sadece ve sadece doFilter fonksiyonunda request ve response nesnelerinin setEncoding("UTF-8") ataması yaparak zincire devam et dedim.

Ve problemim yine çözülmüş oldu.

Tomcat için bir yönetim aracı arayışı...

Tomcat'in kendi yönetim aracı pek kullanışlı değil. Bunun yerine daha detaylı bilgi veren ve kullanışlı bir yönetim aracı arayışı içine girdim.

Örneğin ne kadar hafıza tükettiği, bir web projesinde kaçtane oturum açıldığı ve bunların içeriklerinin detayı, gerektiğinde jsp sayfalarını tekrar derletebilme gibi bir çok seçenek sunan bir alet buldum adı ise : probe .

Probe aynı zamanda suya sabuna dokunmadan bir projeyi kapatıp açmayı sağlaması ise ayrı güzellikti. Doğal olarak o web projesini - context - yeniden çağırabiliyordunuz. Detaylarına kadar size bilgileri veriyordu.

Daha fazla ayrıntılarına giremedim vaktim olmadığından.

Tecrübe: Probe ile bir context yeniden çağrıldığında eğer, o web projesinde Quartz API kullanılmış ise bu quartz programcıklarnın - threads - ölmemesi, fakat yeniden çağrılması olayına denk geldim. Böylece aynı iş için iki adet quartz servisi çalışıyor olacaktı. Hele bi de bu servisler para çekiyorsa değmeyin keyfinize .... :)

UYARI: Aynı sorun tomcat sunucusunun server.xml ayar dosyasında CONTEXT etiketinin reloadable="true" özelliği ile de yaşandı. Mesela web.xml üzerine yazarsanız yenisini context kendini yeniden çağıracak, eski quartz servisleri kapatılamadan yenileri ayağa kalkacak ve aynı iş için birden fazla servisinin çalışacaktır.

Güvenlik için onay resimleri ve MS Core Fonts

Bir çok projede hava oluşturulan resim ile bu resim içerindeki metnin onayını isteyerek bir tür güvenlik sistemi kurdum.

Bu resim servleti png biçeminde - fotmatında - rastgele oluşturulan metni resim olarak ekrana basacak şekilde ayarlandı. Tabii metnin bir kopyası ise oturum nesnesinde - session - tutuldu.

Window sunucuda hiç bir problem yaşamadım. Projeleri CentOs yani linux sunucuya taşıdığımızda ise bazı hatalar ortaya çıktı.

Mesela png basılıyor, hata vermiyor ancak metin otalarda yoktu.

Sonradan çözdüm olayı. Png'de metni basarken sans-serif ttf fontunu kullanmışım. Windows'ta zaten vardı. Ancak linux'ta ayrıca yüklenmeliydi. Yüklendi ve sorun ortadan kalktı.


Konu: An easy way to install Microsoft's TrueType core fonts on linux

Bakılması için örnek bir site : http://corefonts.sourceforge.net

Tomcat URL'de UTF-8 sorunu

Tomcatte ayar dosyaları arasında en meşhuru server.xml ayar dosyasında bir iki ekleme ile URLde UTF-8 problemini çözebilirsiniz.

JSP dosyalarının başında içeriğin utf-8 tipinde bilgi içerdiğini @page direktifi ile yapabilirsiniz. Ama içeriğiniz yine de düzgün görünmüyorsa bir filtre yazarsınız. Ve filtre her çeğrılan JSP dosyası için response ve request nesnelerinin karekter kodlamasının utf-8 olduğunu söylersiniz. Böyle bu sorununuz çözülür.

Diğer yollardan biri ise server.xml'de host tanımına URIencoding="UTF-8" ek tanımını eklemek. Böyle o host ile tanımlanan uygulamalarda otomatik karekter kodlaması UTF-8 olduğunu tomcat anlayacaktır. Bu tanımla ile form post ve get metodlarıyla veya URLden direk gelen bilgilerin UTF-8 olarak JSP içerisine düşeceğinin garantisini vermez.

Bunun için server.xml'de connector etiketine de host etiketine eklediğiniz şeyi uygulamanız gerekecektir. Bu sornu çözecektir. Artık utf-8 probleminiz umuyorum kalmayacaktır.

Filtrenizi silmeyin ne olur ne olmaz.... :)

Tecrübe:  CentOS makinada bir dizi proje yapıldı ve bu projeler faaliyete geçirildi. Karekter kodlamasında sıkıntılar gözlendi. Utf-8 filtresi bulunmasına rağmen içerikleri JSP'lerde gösterirken değil ama URLde mesela formdan gelen bilgilerde utf-8 kodlaması sorunlu idi.

JSP'ler içerisine bakıldı. @page direktifi ile sayfa karakter kodlamasının utf-8 olduğu gözlendi. Utf-8 filtresine bakıldı. Çalışmasının normal olduğu ve yapması gerektiği gibi response, request nesnelerinin karekter kodlamalarının setEncodin("UTF-8") konutuyla utf-8'e çevrildiği gözlendi.

Lakin URLlerde hala sorun devam etmekte idi. Tomcat conf dizini altında server.xml dosyasında HOST etiketine URIEncoding="UTF-8" eklendi. Ancak sorun çözülmedi.

Tam hatırlamamakla beraber windows makinada bu kadarıyla sorunlarımız çözülmüştü. Şimdi ise linux kullanıyorduk.

Bu sefer HOST etiketine uyguladığım şeyleri CONNECTOR etiketine de uyguladım.

Ve sonuç olumlu idi. Artık sorun yok id.

:) Ne olur ne olmaz diye Utf-8 filtresini kaldırmadım. Bu filte en azından şöyle bir şeye yardımcı oluyor eğer servletinizde direk birşeyler bastırırsanız karekter kodlaması bilin bakalım ne oluyor filtreniz aktif iken...