Spring Boot Interceptor Nedir? 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
Gelen isteklerin endpointe ulaşmadan önce işlenmesini sağlamamıza yarayan bir sınıftır. Bir servlet
e 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.
- HandleInterceptor arayüzünü implement etmek.
- 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 complete
Code language: CSS (css)
No Comment! Be the first one.