2010-08-04 11 views
6

Mantık, filtrenin vurulduğu, koşulun doğru olmadığı ve filtre zincirinden geçtiği. Yanıt işlendikten sonra, filtre vurulur ve koşul şimdi doğrudur (bir istek özniteliği ayarlanmıştır). İlerletmeyi yürütür, ancak sayfa asla ileriye doğru gitmez. Bunun cevabın işlenmekte olan cevabı ile ilgili olduğunu biliyorum çünkü zincire ilk kez ulaşmadan önce farklı mantığı test ettim ve başarılı bir şekilde ileri sürdüm. Benim dağıtım tanımlayıcısı gelenYanıt verildikten sonra bir sunucu filtresinden iletilmek veya yönlendirmek mümkün mü?

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 

    HttpServletRequest httpServletRequest = (HttpServletRequest)request; 

    if (some condition equals true) { 
     httpServletRequest.getRequestDispatcher("/home.jsp").forward(request, response); 
     return; 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

Örnek:

<filter> 
    <filter-name>MyFilter</filter-name> 
    <filter-class>com.filters.MyFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>MyFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

cevap

14

bir HttpServletResponse ait "kararlı" durumu gerçekten yanıt başlıkları altında yatan sokete yazılı olup olmadığını söylemenin bir yoludur. Bir "taahhüt" cevabı, yazılı olan ilk satırın (en azından) vardı. Yanıtın ilk satırı durum kodunu içerdiğinden, taahhüt edilen bir yanıtın durum kodunu değiştiremezsiniz ... ve bu durum bir yönlendirme yapmak için durumu 3xx olarak değiştirmek için çok geç demektir. Benzer şekilde, yanıt göndermeye başladığınız için yerel bir yönlendirme yapamazsınız.

4

Özel bir HttpServletResponse kullanarak istediğiniz şeyi elde edebilirsiniz. Bu sarılı HttpServletResponse'yi filtre zincirinden geçirirsiniz. Tüm yazma isteklerini, durum değişkenlerini ve başlıkları saklamak için yerel değişkenleri saklayan yerel bir OutputStream sağlayabilirsiniz. Filtrenize geri döndükten sonra yönlendirmeyi gerçekleştirmeye veya sonuçları yerel değişkenlerden sarıcıdan orijinal ServletResponse'ye geri kopyalamaya karar verebilirsiniz (örn. Durum kodunu ve üstbilgisini ayarlayın ve sonuçları yerel çıktı akışından kopyalayın. sunucu yanıtı çıktı akışı).

Düzenleme:

bir CharResponseWrapper kullanan bir kod, örneğin Programming Customized Requests and Responses bölümüne bakın. Örnek, özel bir Yazar kullanır, ancak bir OutputStream'e kolayca genişletilebilir. Servlet'inizin nasıl kullanıldığına bağlı olarak, orijinal yanıt üzerinde herhangi bir şey yapılmasını geciktirmek için getWriter() ve getOutputStream()'un birini veya her ikisini geçersiz kılmanız gerekir. Buna ek olarak, false'u döndürmek için isCommitted()'u geçersiz kılmanız gerekecek, böylece ileriye doğru herhangi bir zamanda filtre zincirinden yürütülür. Yeni içeriği (üstbilgiler dahil) yeniden yönlendirildikten/ilettikten sonra kaydetmek için resetBuffer()'u yeni bir OutputStream/ Writer başlatacak şekilde geçersiz kılmanız gerekecektir.

+0

Yukarıda istenen "/ home.jsp" yönlendirme dayalı bazı örnek kodlar sağlayabilir misiniz? Bu konuda da sorun yaşıyorum. Teşekkürler! – DougA

+0

@Doug Düzenlemelerimi cevabımda kontrol edin. Bu yapılması gerekenleri özetlemeli. – shams

İlgili konular