Yay MVC'sinde Durdurucu ve Filtre Arasındaki Fark


108

Biraz kafam Filterve Interceptoramaçlar konusunda kafam karıştı .

Dokümanlardan anladığım gibi, Interceptoristekler arasında çalıştırılır. Öte yandan Filter, görünüm oluşturma işleminden önce, ancak Denetleyici yanıtı oluşturduktan sonra çalıştırılır.

Öyleyse postHandle(), Interceptor ile doFilter()Filter arasındaki fark nerede ?

Bahar MVC şeması Hangi kullanım durumlarında kullanılması gereken en iyi uygulama nedir? Bu resimde nereye eserler Filterlar ve Interceptors?

Yanıtlar:


87

Gönderen HandlerIntercepterbireyin javadoc :

HandlerInterceptortemelde bir Servlet'e benzer Filter, ancak ikincisinin aksine, işleyicinin kendisinin yürütülmesini engelleme seçeneği ile özel ön işlemeye ve özel son işlemeye izin verir. Filtreler daha güçlüdür, örneğin zincirden teslim edilen istek ve yanıt nesnelerinin değiş tokuşuna izin verirler. Uygulama bağlamında web.xml, bir filtrenin yapılandırıldığını unutmayın HandlerInterceptor.

Temel bir kılavuz olarak, işleyiciyle ilgili ayrıntılı ön işleme görevleri HandlerInterceptor, özellikle faktörlü ortak işleyici kodu ve yetkilendirme kontrolleri olmak üzere uygulamalar için adaydır . Öte yandan, a Filter, çok parçalı formlar ve GZIP sıkıştırması gibi istek içeriği ve görüntüleme içeriği işleme için çok uygundur. Bu tipik olarak, filtreyi belirli içerik türleriyle (ör. Resimler) veya tüm isteklerle eşleştirmenin gerekli olduğu zamanı gösterir.

Bununla birlikte:

Öyleyse Interceptor#postHandle()ve arasındaki fark nerede Filter#doFilter()?

postHandleişleyici yöntemi çağrıldıktan sonra ancak görünüm oluşturulmadan önce çağrılacaktır. Yani, görünümüne daha modeli nesneleri ekleyebilirsiniz ancak olabilir değil değiştirmek HttpServletResponsezaten taahhüt beri.

doFilterçok daha çok yönlüdür postHandle. İsteği veya yanıtı değiştirebilir ve zincire iletebilir veya hatta istek işlemeyi engelleyebilirsiniz.

Ayrıca, preHandleve postHandleyöntemlerinde, HandlerMethodisteği işleyenlere erişiminiz vardır . Böylece, işleyicinin kendisine bağlı olarak ön / son işleme mantığı ekleyebilirsiniz. Örneğin, bazı ek açıklamalara sahip işleyici yöntemleri için bir mantık ekleyebilirsiniz.

Hangi kullanım durumlarında kullanılması gereken en iyi uygulama nedir?

Belgenin dediği gibi, işleyiciyle ilgili ayrıntılı ön işleme görevleri HandlerInterceptor, özellikle faktörlü ortak işleyici kodu ve yetkilendirme kontrolleri olmak üzere uygulamalar için adaylardır . Öte yandan, a Filter, çok parçalı formlar ve GZIP sıkıştırması gibi istek içeriği ve görüntüleme içeriği işleme için çok uygundur. Bu tipik olarak, filtreyi belirli içerik türleriyle (ör. Resimler) veya tüm isteklerle eşleştirmenin gerekli olduğu zamanı gösterir.


Bir filtrenin web.xml'de, uygulama bağlamında bir HandlerInterceptor'da yapılandırıldığını unutmayın ??? lütfen açıklayabilir misin?

4
Filtre , Servlet API ile ilgilidir ve Spring'e HandlerIntercepterözgü bir konsepttir. Bir sunucu uygulaması filtresini kaydetmek için, eski web.xml(Servlet 2.5 ve daha eski sürümler) veya yeni programlı yaklaşımı (Servlet 3+) kullanarak bunu kaydedebilirsiniz . Bu HandlerInterceptersadece bir Bahar soyutlaması olduğundan, Bahar bağlamında kayıt olmalısınız
Ali Dehghani

Filtre, Servlet API ile ilgilidir ve HandlerIntercepter, Spring'e özgü bir konsepttir. coorect! ancak web.xml tarafından yapılan kayıt her ne olursa olsun parçası WebApplicationdağıtıcı başına tek bir parçadır, bu nedenle sunucu uygulaması ve filtre bağlamla ilişkilendirilirse, durdurucuyu ilişkilendirmek ve filtrelemek iyi bir uygulamadır, rootContextböylece u hv birden çok dağıtım programı aynı şeyi paylaşabilir.

9

Filtre : - Adından da anlaşılacağı gibi bir filtre, gelen her HTTP isteği ve her http yanıtı için sunucu uygulaması kapsayıcısı tarafından yürütülen bir Java sınıfıdır. Bu şekilde, bir JSP sayfası, bir sunucu uygulaması veya basit bir statik sayfa gibi HTTP gelen isteklerini kaynağa ulaşmadan önce yönetmek mümkündür; aynı şekilde, kaynak çalıştırıldıktan sonra HTTP giden yanıtını yönetmek mümkündür.

Interceptor : - Spring Interceptors, Servlet Filtrelerine benzer, ancak Spring Context içinde hareket ederler, bu nedenle birçok HTTP Talebi ve Yanıtı yönetmek için güçlüdür, ancak tüm Spring bağlamına erişebildikleri için daha karmaşık davranışlar uygulayabilirler.


2
kaynak: mkjava.com/tutorial/filter-vs-interceptor kaynak belirtmek zorunda
Premraj

Peki ya Spring güvenlik filtresi, size aynı zamanda bahar bağlamı da verir.
Aşkı

6

Bir HandlerInterceptor, size bir filtreden daha ayrıntılı kontrol sağlar, çünkü gerçek hedef "işleyiciye" erişiminiz vardır - bu, gerçekleştirdiğiniz eylemin, isteğin gerçekte ne yaptığına bağlı olarak değişebileceği anlamına gelir (oysa sunucu uygulaması filtresi genel olarak uygulanır) tüm isteklere - yalnızca her bir isteğin parametrelerini dikkate alabilir). HandlerInterceptor ayrıca, bir işleyiciyi çağırmadan önce, işleyici tamamlandıktan sonra ancak görüntü oluşturmadan önce (burada görünüm oluşturmayı tamamen atlayabilirsiniz) veya görünümün kendisi oluşturulduktan sonra davranışı uygulayabilmeniz için 3 farklı yöntem sağlar. Ayrıca, farklı işleyici grupları için farklı durdurucular kurabilirsiniz - durdurucular handlerMapping üzerinde yapılandırılır ve birden fazla handlerMappings olabilir.

Bu nedenle, tamamen genel bir şey yapmanız gerekiyorsa (ör. Tüm istekleri günlüğe kaydetme), bir filtre yeterlidir - ancak davranış hedef işleyiciye bağlıysa veya istek işleme ile görünüm oluşturma arasında bir şey yapmak istiyorsanız, o zaman HandlerInterceptor bu esnekliği sağlar.

Referans: http://static.springframework.org/sp...ng-interceptor


2
Bağlantı koptu.
Jason Law
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.