Arşivler

Spring Boot Interceptor Nedir? Uygulama Örneği

Spring Boot Interceptor Nedir Kullanım Uygulama Örneği
Spring Boot Interceptor Nedir Kullanım Uygulama Örneği

Spring Boot Dersleri‘ne devam ediyorum.

Bu yazıda Spring Boot projelerinde Interceptor kullanımından bahsedeceğim. Ama öncesinde Interceptor nedir buna bakalım. Sonrasında ise bir uygInnedir ve nasıl kullanıldığına bakacağız. Sonrasında ise bir uygulama örneği yapacağım.

Interceptor Nedir?

Interceptor, Spring MVC paketinde bulunan bir sınıftır. HTTP isteklerinin öncesi, sonrası ve tamamlandıktan sonra yapılması gereken işlemleri bu sınıf aracılığı ile handle edebilmekteyiz.

Interceptor Nasıl Çalışır

Spring Boot Interceptor Nedir

Gelen isteklerin endpointe ulaşmadan önce işlenmesini sağlamamıza yarayan bir sınıftır. Bir servlete benzer ve DispatcherServlet ten sonra bulunmaktadır. HTTP isteklerini kontrol etmek için kullanılır. İstek başlamadan önce çağrılır ve HTTP isteği ile ilgili bilgileri içeren HttpServletRequest nesnesini ve HTTP isteği ile ilgili yanıtı döndürecek HttpServletResponse nesnesini alır.

Interceptor Kullanım Amacı

Genellikle kimlik doğrulama, validasyon ve loglama işlemlerinde bu yöntemi kullanmaktayız.

Interceptor Kullanım Yöntemleri

Uygulamamızda Interceptor’u kullanabilmemiz için iki yöntem bulunmaktadır.

  1. HandleInterceptor arayüzünü implement etmek.
  2. HandleInterceptorAdapter sınıfını extends ederek kullanmak.

HandlerInterceptor

Uygulamamızda HandlerInterceptor interface’sini implement ederek kullanabiliriz. Bu sınıf org.springframework.web.servlet paketinin altında bulunmaktadır. Override ederek kullanabileceğimiz metodlar nelerdir bunlara bakalım.

preHandle()

Bu method, kullanıcıdan gelen istek endpointe gönderilmeden önce çalışır. Method boolean değer döndürür. true değeri isteğin devam etmesini sağlar. false değeri ise isteği keser ve işlem devam etmez.

postHandle()

Bu method, client’e yanıt gönderilmeden önce işlemleri gerçekleştirmek için kullanılır ve sonrasında istemciye yanıt gönderilir.

afterCompletion()

Bu method, tüm request ve respond işlemleri tamamlandıktan sonraki işlemler için kullanılır.

Spring Boot Interceptor Uygulama Örneği

Spring Boot Interceptor uygulamasında bir loglama işlemi gerçekleştireceğiz. Bu loglama aşamaları bizim oluşturacağımız rest api’ya gelmeden, geldikten sonra ve işlem tamamlandıktan sonra loglama işlemini gerçekleştireceğiz. Yukarıda açıkladığım Interceptor arayüzünü kendi sınfımıza implement edeceğiz.

Maven bağımlılığımız aşağıdaki gibi olacaktır.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>Code language: HTML, XML (xml)

LoggingInterceptor sınıfımızı oluşturalım.

@Component
public class LoggingInterceptor implements HandlerInterceptor {
    private static final Logger LOG = LoggerFactory.getLogger(LoggingInterceptor.class);
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object)  {
        LOG.info("Before Handler execution");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView model){
        LOG.info("Handler execution is complete");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception){
        LOG.info("Request is complete");
    }
}
Code language: Java (java)

HandlerInterceptor interface’sini implement ederek preHandle, postHandle ve afterCompletion methodlarını Override ederek içerisine loglarımızı girdik. Rest api’mizde bu döngülerin öncesi, sonrası ve tamamlandıktan sonra çalışacak loglarımızı yazdık. Bu methodlara gelen HttpServletRequest ve HttpServletResponse değerlerini alarak da özelleştirebiliyoruz.

WebConfig sınıfımızı oluşturalım ve bu sınıf WebMvcConfigurer sınıfını implement ederek yazdığımız LoggingInterceptor sınıfını InterceptorRegistry kaydederek IOC yaparak çalışmasını sağlamış olacağız.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggingInterceptor());
    }
}
Code language: Java (java)

Şimdi bir Controller sınıfı oluşturalım ve bu bir RestController olacak ve cevap olarak sadece “Hello World” yazacağız.

@RestController
public class HelloWorldController {
    Logger LOG = LoggerFactory.getLogger(this.getClass());

    @RequestMapping("/")
    public String executeLogger() {
        LOG.info("Inside Controller");
        return "Hello World";
    }
}
Code language: Java (java)

Şimdi projemizi çalıştıralım ve sonuca bakalım.

Hello World

Cevap olarak gördük ve şimdi uygulamamızın loglarına bakalım.

INFO -interceptor.LoggingInterceptor  : Before Handler execution
INFO -controller.HelloWorldController : Inside Controller
INFO -interceptor.LoggingInterceptor  : Handler execution is complete
INFO -interceptor.LoggingInterceptor  : Request is completeCode language: CSS (css)

Uygulama Örneğini İndir

Projenin Kaynak Kodlarına Ulaş


Önceki Ders: Spring Boot Redis Cache Kullanımı
Spring Boot Dersleri
Sonraki Ders: Spring Boot Content Negotiation XML – JSON