![translation](https://cdn.durumis.com/common/trans.png)
Bu, AI tarafından çevrilen bir gönderidir.
Dil Seç
Text summarized by durumis AI
- Filtreler, Dispatcher Servlet'e istek iletilmeden önce/sonra URL kalıbıyla eşleşen tüm istekler için ek işlemleri işleyebilecek işlevsellik sağlayan J2EE standart özelliktir. Web sunucusunda çalışır ve ara kesiciler, Dispatcher Servlet'in denetleyiciyi çağırmadan önce ve sonra isteği ve yanıtı başvurabilen veya işleyebilen işlevsellik sağlayan Spring tarafından sağlanan bir teknolojidir. Spring bağlamında çalışır.
- Argüman Çözümleyici, herhangi bir isteğin denetleyiciye girdiğinde, isteğe gelen değerlerden istediğiniz nesneyi dolaylı olarak oluşturabilir.
- Filtreler ve ara kesiciler, Spring kapsayıcısında mı yoksa web kapsayıcısında mı çalıştıkları, Dispatcher Servlet'i mi yoksa denetleyiciyi mi referans alarak istekleri işleyip işlemedikleri açısından farklılık gösterir. Argüman Çözümleyici, ara kesiciden sonra çalışır ve belirli bir nesneyi döndürür.
Filtre (Filter) nedir?
Filtre, J2EE standart spesifikasyonunda bulunan bir özelliktir. İstekler Dispatcher Servlet'e ulaşmadan önce/sonra URL kalıplarına uyan tüm istekler için ek işlemler gerçekleştirme imkânı sağlar. Yani, Spring Container değil, Tomcat gibi web container tarafından yönetilir, bu nedenle istekler Dispatcher Servlet'e ulaşmadan önce işlenir.
Filtre (Filter) uygulama
Bir filtre eklemek için javax.servlet'in Filter arayüzünü uygulamanız gerekir. Bu arayüz, aşağıdaki 3 yöntemi içerir.
- init yöntemi
- Filtre nesnesini başlatmak ve hizmete eklemek için bir yöntemdir. Web container init yöntemini bir kez çağırır, filtre nesnesini başlatır. Daha sonraki istekler, doFilter() yöntemi aracılığıyla işlenir.
- doFilter yöntemi
- URL kalıbına uyan tüm HTTP istekleri, Dispatcher Servlet'e ulaşmadan önce web container tarafından yürütülür. Dispatcher Servlet, istekleri HTTP yanıtını istemciye göndermeden önce web container tarafından yürütülür.
doFilter() parametresi olarak bir FilterChain bulunur. FilterChain'in doFilter() yöntemi, isteği bir sonraki hedefe iletir. İsteği chain.doFilter()'den önce/sonra eklediğiniz işlem adımları, istediğiniz işlemi gerçekleştirmenizi sağlayacaktır.
- URL kalıbına uyan tüm HTTP istekleri, Dispatcher Servlet'e ulaşmadan önce web container tarafından yürütülür. Dispatcher Servlet, istekleri HTTP yanıtını istemciye göndermeden önce web container tarafından yürütülür.
- destory yöntemi
- Filtre nesnesini hizmetten kaldırmak ve kullandığı kaynakları geri döndürmek için bir yöntemdir. Bu, web container tarafından bir kez çağırılır ve daha sonra doFilter() tarafından işlenmez.
Örnek kod - Servlet spesifikasyonu
@WebFilter("/*")
public class dolphagoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
//Burada ön işleme
request.setCharacterEncoding("UTF-8");
System.out.println("doFilter() öncesi....");
filterChain.doFilter(request, response);
//Burada son işleme
System.out.println("doFilter() sonrası....");
}
@Override
public void destroy() { }
Örnek kod - @Component
@Order(1)
@Component
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() { }
- @Component: Filtreyi Spring Bean olarak kaydedebilir.
- @Order: Birden fazla filtre varsa, bunları sırayla düzenleyebilirsiniz.
- Servlet spesifikasyonuna uygun bir filtreyi bu şekilde Spring Bean olarak kaydettiğinizde, Spring spesifikasyonuna uygun diğer Bean'leri de kullanabilirsiniz.
Örnek kod - @Configuration
@Configuration
public class CustomRegistrationBean {
@Bean
public FilterRegistrationBean customFilterBean() {
FilterRegistrationBean registration = new FilterRegistrationBean<>();
registration.setFilter(new CustomFilter());
registration.setOrder(1);
registration.addUrlPatterns("/api/*");
return registration;
}
Belirli bir URI'da filtreyi çalıştırmak istiyorsanız, filtreyi Spring Bean olarak kaydetmek için FilterRegistrationBean kullanabilirsiniz.
Filtre (Filter) amaçları
Genellikle istek parametrelerinin kendisinin doğrulanması ve işlenmesinden sorumludur.
- Güvenlikle ilgili genel görevler
- Filtre, web container'da çalıştığı için güvenlik denetimlerini (XSS, CSRF savunması vb.) gerçekleştirebilir ve geçersiz istekleri engelleyebilir. İstekler Spring Container'a ulaşmadan engellendiği için güvenliği daha da artırabilirsiniz.
- Tüm istekler için günlük kaydı
- Görüntü/veri sıkıştırma ve dize kodlaması
- Filtre, web uygulamasında genel olarak kullanılan görüntü veya veri sıkıştırması veya dize kodlaması gibi işlevleri uyguladı.
- ServletRequest özelleştirmesi
- HttpServletRequest, Body içeriğini yalnızca bir kez okuyabilir. Bu nedenle, Filter veya Interceptor, Body'yi okuyamaz. Body'yi günlüğe kaydetmek için, özel bir ServletRequest oluşturabilirsiniz.
Interceptor (Interceptor)
Interceptor (Interceptor) nedir?
Interceptor (Interceptor), J2EE standart spesifikasyonunda bulunan filtre (Filter) ile tersine olarak, Spring tarafından sağlanan bir teknolojidir ve Dispatcher Servlet'in denetleyiciyi çağırmasından önce ve sonra istek ve yanıtları referans alabilir veya işleyebilir. Yani, web container'da çalışan filtrelerin aksine, interceptor'lar Spring bağlamında çalışır.
Dispatcher Servlet, işleyici eşleme aracılığıyla uygun denetleyiciyi bulmak için istekte bulunur ve sonuç olarak yürütme zincirini (HandlerExecutionChain) döndürür. Bu nedenle, bu yürütme zinciri, bir veya daha fazla interceptor kaydedilmişse, interceptor'lardan sırasıyla geçerek denetleyicinin yürütülmesini sağlar ve interceptor yoksa denetleyiciyi doğrudan çalıştırır.
Interceptor (Interceptor) uygulama
Bir interceptor eklemek için org.springframework.web.servlet.HandlerInterceptor arayüzünü uygulamanız gerekir. Bu, aşağıdaki 3 yöntemi içerir.
- preHandle yöntemi
- preHandle yöntemi, denetleyici çağırılmadan önce yürütülür. Bu nedenle, denetleyici öncesinde işlenmesi gereken ön işleme işlemleri veya istek bilgileri işlenmesi veya eklenmesi için kullanılabilir.
- preHandle yönteminin üçüncü parametresi olan handler parametresi, @RequestMapping ile işaretlenmiş yöntemin bilgilerini soyutlayan bir nesnedir.
- preHandle yönteminin dönüş türü boolean'dır. Dönüş değeri true ise işleme bir sonraki adıma geçer, false ise işlem durdurulur ve daha sonraki işlemler (bir sonraki interceptor veya denetleyici) gerçekleştirilmez.
- postHandle yöntemi
- postHandle yöntemi, denetleyici çağırıldıktan sonra yürütülür. Bu nedenle, denetleyici sonrasında işlenmesi gereken son işleme işlemleri varsa kullanılabilir.
- afterCompletion yöntemi
- afterCompletion yöntemi, adı da anlaşılacağı üzere, tüm görünümler sonucu oluşturulmayı da içeren tüm işlemler tamamlandıktan sonra yürütülür.
Örnek kod
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor());
registry.addInterceptor(new LoggingInterceptor());
}
- Oluşturulan interceptor'u Bean olarak kaydeder.
- WebMvcConfigurer arayüzünün addInterceptors() yöntemine oluşturulan interceptor'u kaydeder.
- Interceptor'lar, InterceptorRegistry'ye kaydedilme sırasına göre çalışır.
Interceptor (Interceptor) amaçları
Genellikle hizmet mantığını kullanarak istek bilgisi tutarlılığını işlemeyi ele alır.
- Kimlik doğrulama/yetkilendirme gibi genel görevler
- Tipik olarak, istemci isteğiyle ilgili işlemler, denetleyiciye geçmeden önce kontrol edilebilir.
- API çağrıları için günlük kaydı
- Alınan HttpServletRequest, HttpServletResponse nesneleri aracılığıyla istemci bilgilerini kaydedebilirsiniz.
- Denetleyiciye iletilen verilerin işlenmesi
- Alınan HttpServletRequest, HttpServletResponse nesneleri işlenebilir ve denetleyiciye iletilebilir.
- AOP taklidi
- preHandle() yönteminin üçüncü parametresi olan HandlerMethod ile yürütülecek yöntemin imzası ve ek bilgiler bulunabilir, böylece çalışma mantığının yürütülüp yürütülmeyeceği belirlenebilir.
Filter (Filter) vs Interceptor (Interceptor)
- Filtre web bağlamında, interceptor ise Spring bağlamında çalışır, bu nedenle çalışma zamanları farklıdır.
- Filtre, Dispatcher Servlet'in öncesini ve sonrasını işleyebilirken, interceptor denetleyicinin öncesini ve sonrasını işleyebilir.
- Filtre, Spring ile ilgili olmaksızın genel olarak işlenmesi gereken işlemleri veya giren parametreleri doğrudan doğrulamak için veya HttpServletRequest yerine ServletRequest kullanmak için iyi bir seçimdir.
- Interceptor, Spring seviyesinde gelen istemci isteğiyle ilgili genel olarak işlenmesi gereken işlemler veya hizmet mantığını dahil etmesi gerektiğinde iyi bir seçimdir.
- Interceptor, @ControllerAdvice ve @ExceptionHandler kullanarak istisna işlemini gerçekleştirebilir, ancak filtre bunları kullanarak istisna işlemini gerçekleştiremez.
- Filtre, genellikle doFilter() yönteminin etrafını try~catch bloğu ile sararak o anda oluşan istisnaları hemen işler.
Argument Resolver
Argument Resolver nedir?
Argument Resolver, herhangi bir isteğin denetleyiciye ulaştığında, istekte gelen değerlerden istediğiniz nesneyi dolaylı olarak oluşturmanızı sağlar.
Argument Resolver amaçları
Örneğin, bir JWT belirteci ile istekte bulunulduğunu varsayalım. Bu belirtecin geçerli bir belirteç olup olmadığını doğrulamalı ve belirteçte depolanan kimliği çıkararak giriş yapan kullanıcı nesnesini oluşturmamız gerekir.
Bu durumda, Argument Resolver kullanılmazsa, belirteci doğrulama ve giriş yapan kullanıcı nesnesine dönüştürme işlemi tüm denetleyicilerde uygulanmalıdır. Bu, kullanıcı doğrulaması gerektiren denetleyicilerde yinelenen kodlara ve denetleyicinin sorumluluğunun artmasına neden olur. Argument Resolver bu sorunu çözebilir.
Argument Resolver uygulama
ArgumentResolver, HandlerMethodArgumentResolver arayüzünü uygulayarak kullanılabilir. Bu arayüz, aşağıdaki iki yöntemi uygulamayı belirtir.
boolean supportsParameter(MethodParameter parameter);
@Nullable
- supportsParameter yöntemi
- ArgumentResolver'ın yürütülmesini istediğiniz Parametre'nin önüne belirli bir anotasyon oluşturup ekleyin. supportsParameter() yöntemi, alınan yöntemin argümanında istediğiniz anotasyonun olup olmadığını kontrol eder ve istediğiniz anotasyonu içeriyorsa true döndürür.
- resolveArgument yöntemi
- supportsParameter yönteminde true alındığında, yani belirli bir anotasyonlu bir yöntem varsa, parametreyi istediğiniz biçimde bilgiyi bağlayarak döndüren yöntemdir.
Bu şekilde ArgumentResolver kullanıldığında, denetleyicinin uygulaması aşağıdaki gibi olur.
@GetMapping("/me")
public ResponseEntity findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) {
MemberResponse memberResponse = memberService.findMember(loginMember.getId());
return ResponseEntity.ok().body(memberResponse);
Argument Resolver ve Interceptor (Interceptor) arasındaki farklar
- ArgumentResolver, interceptor'dan sonra çalışır ve herhangi bir isteğin denetleyiciye ulaştığında, istekte gelen değerlerden istediğiniz nesneyi döndürür.
- Öte yandan, interceptor, denetleyicinin gerçekten yürütülmesinden önce isteği yakalar ve belirli bir nesneyi döndüremez. Yalnızca boolean veya void dönüş türleri vardır.
Kaynaklar
- https://mangkyu.tistory.com/173
- https://junhyunny.github.io/spring-boot/filter-interceptor-and-aop/
- https://supawer0728.github.io/2018/04/04/spring-filter-interceptor/
- https://tecoble.techcourse.co.kr/post/2021-05-24-spring-interceptor/
- https://baeldung-cn.com/spring-mvc-handlerinterceptor-vs-filter
- https://www.baeldung.com/spring-boot-add-filter
Beklenen görüşme soruları ve cevapları
Filtre nedir?
Filtre, Dispatcher Servlet'e istek ulaşmadan önce/sonra URL kalıplarına uyan tüm istekler için ek işlemler gerçekleştirme imkânı sağlayan bir özelliktir ve servlet container seviyesinde çalışır.
Filtre ne zaman kullanılır?
Filtrelerde Spring ile ilgili olmaksızın genel olarak işlenmesi gereken işlemleri işleyebilirsiniz. Ayrıca istek parametrelerini doğrularken kullanılır.
Tipik olarak güvenlik ile ilgili genel görevler, tüm istekler için günlük kaydı, görüntü/veri sıkıştırması ve dize kodlaması, ServletRequest özelleştirme işlemleri işlenir.
Interceptor nedir?
Interceptor, Dispatcher Servlet'in denetleyiciyi çağırmasından önce ve sonra istek ve yanıtları referans alabilir veya işleyebilen bir özelliktir ve Spring container seviyesinde çalışır.
Interceptor ne zaman kullanılır?
Interceptor, istemci isteğiyle ilgili genel olarak işlenmesi gereken işlemleri veya doğrulama işlemi sırasında hizmet mantığını çağırmanız gerektiğinde kullanılır.
Tipik olarak, kimlik doğrulama/yetkilendirme gibi genel görevler, API çağrıları için günlük kaydı, denetleyiciye iletilen verilerin işlenmesi işlemleri işlenir.
Filtre ve Interceptor arasındaki farklar nelerdir?
Filtre servlet container seviyesinde çalışır, interceptor ise Spring container seviyesinde çalışır.
Filtre, Dispatcher Servlet'in öncesini ve sonrasını işleyebilirken, interceptor denetleyicinin öncesini ve sonrasını işleyebilir.
Bu nedenle, filtre, Spring ile ilgili olmaksızın genel olarak işlenmesi gereken işlemleri yaparken, interceptor, istemci isteğiyle ilgili genel olarak işlenmesi gereken işlemleri yaparken kullanılır.
Argument Resolver nedir?
Argument Resolver, herhangi bir isteğin denetleyiciye ulaştığında, istekte gelen değerlerden istediğiniz nesneyi dolaylı olarak oluşturmanızı sağlar.
Argument Resolver ne zaman kullanılır?
JWT belirteci ile istekte bulunulduğunda, geçerli bir belirteç olup olmadığını doğrulamalı ve belirteçte depolanan kimliği çıkararak LoginMember adlı nesneyi oluşturmanız gerektiğinde kullanılabilir.
Interceptor ve Argument Resolver arasındaki farklar nelerdir?
Argument Resolver, herhangi bir isteğin denetleyiciye ulaştığında, istekte gelen değerlerden istediğiniz nesneyi döndürür. Öte yandan, interceptor belirli bir nesneyi döndüremez ve interceptor çalıştırıldıktan sonra Argument Resolver çalışır.