2015-04-28 22 views
5

HttpServlet numaralı bir sunucu uygulamasına ve bir GET isteğinin uygulanmasına sahibim. Yukarıdaki sunucu URL'sine eşlenmiş bir filtre de (bir dış kütüphaneden) kullanıyorum. Şimdi bir istisna filtresi tarafından atılan ve beklendiği gibi bujava uygulamasında belirli bir özel durum işleme örneği

CİDDİ olsun edilmektedir: yolu ile bağlamda servlet [MyServlet] için) (Servlet.service [] istisna

bildiğim

attı error-page açıklaması, bu özel durumun yakalanmasının standart bir yolu olabilir, ancak belirli bir sunucu filtresinden istisnayı yakalamanın bir yolu var mı? Zaten bir error-page açıklamasına ve basit bir html sayfasına yönlendiriyorum. Ayrıca bir jsp sayfasına yönlendirmek istemiyorum ve hata parametrelerini kullanarak oynamak istiyorum. Kısacası, sorularım şunlardır:

  • bir belirli servlet için bir istisna yakalamak ve bunları işlemek için daha basit, zarif bir yolu var mı? error-page tanımlayıcısının bir istisna atan sunucu uygulamasını seçmek için herhangi bir alanı yok gibi görünüyor.
  • özel filtresinde meydana gelen bir istisnayı yakalamak ve filtrenin attığı özel durumun özel bir istisna olmadığını dikkate alarak bunları işlemek mümkün mü?
+0

Bu, işaretli veya denetlenmeyen bir istisna mı? – fge

+0

İstisna, nedeni bilinen bir "ArrayIndexOutOfBoundsException", kullanıcıdan geçersiz bir girdidir. Bu, filtre belgelerinde belgelenmiştir ve bu, kontrol edilen istisna olarak sınıflandırılır mı? Thing, 'NullPointerException' olabilir ve _specific_ filtresinden geldiğini _knowing_ yakalayabilmek istiyorum. – user30622

+0

Bu istisna, o zaman işaretlenmemiş. Ancak bu filtre sizin ise, neden filtrenin kendisinde tamir etmiyorsunuz? Eğer bu durumun atılabildiğini ve 401'inin bu durumda geri dönüp dönmeyeceğini biliyorsanız, sadece istisnayı bırakmak yerine – fge

cevap

5

Filtreyi genişletemez ve süper tarafından atılan özel durumları kaldıramaz mısınız?

public class MyFilter extends CustomFilter{ 

     private static final Map<String, String> exceptionMap = new HashMap<>(); 

     public void init(FilterConfig config) throws ServletException { 
       super.init(config); 
       exceptionMap.put("/requestURL", "/redirectURL"); 
       exceptionMap.put("/someOtherrequestURL", "/someOtherredirectURL"); 
     } 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
      try{ 
        super.doFilter(request, response, chain); 
       }catch(Exception e) 
        //log 
        String errURL = exceptionMap.get(request.getRequestURI()); 
        if(errURL != null){ 
         response.sendRedirect(errURL); 
        } 
       } 
     } 
} 
+0

Tamam, teşekkürler. Bu mümkün olabilir. Tek şey şu ki, aynı filtreyi kullanarak bir avuç servletim var, bu yüzden bu çözümle 'servlet_name' vb. Tanımlamak için ek kod eklemem gerekecek ve her biri için işlem yapmam gerekiyor. İstisnada ne tür bir hizmet verdiğimi belirleyebileceğim herhangi bir basit çözüm olup olmadığını merak ediyordum. – user30622

+0

Henüz Servlet'e ulaşmadı, bu yüzden bir Servlet'e işaret eden bir URL (ve istisna olmasaydı Servlet'e erişmiş olan). Böyle bir sunucu URL'sinin haritasını koruyabilir ve istisna işlemine bakabilirsin. Ne hakkında konuştuğumu göstermek için kodumu düzenleyeceğim, – ramp

+0

Tamam. Bir özellik ya da öyleyse, muhtemelen yukarıdakilerden daha kolay olamaz. :) Tekrar teşekkürler! – user30622