Spring MVC-তে HandlerInterceptor এবং @WebMvcConfigurerAdapter দুটি উপাদান ওয়েব রিকোয়েস্ট-রেসপন্স চেইনে কাস্টম লজিক প্রয়োগ করার জন্য ব্যবহৃত হয়। এগুলি সাধারণত লগিং, অথেন্টিকেশন, অথোরাইজেশন, বা অন্যান্য ক্রস-কাটিং কনসার্ন (cross-cutting concerns) যেমন সেশন হ্যান্ডলিং, ট্রানজ্যাকশন ম্যানেজমেন্ট ইত্যাদি বাস্তবায়ন করতে ব্যবহৃত হয়।
১. HandlerInterceptor
HandlerInterceptor একটি ইন্টারফেস যা HTTP রিকোয়েস্টের প্রক্রিয়াকরণের বিভিন্ন ধাপে কাস্টম লজিক প্রয়োগ করতে সাহায্য করে। এটি রিকোয়েস্ট হ্যান্ডলিংয়ের আগে, পরে এবং এক্সেপশন হ্যান্ডলিংয়ের সময় ব্যবহৃত হতে পারে।
HandlerInterceptor এর প্রধান মেথডগুলি:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):- এই মেথডটি রিকোয়েস্ট হ্যান্ডলার (কন্ট্রোলার) কল করার আগে চালিত হয়।
- যদি
trueফেরত আসে, তাহলে রিকোয়েস্ট হ্যান্ডলার চালানো হবে, অন্যথায় রিকোয়েস্ট বন্ধ হবে।
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):- এই মেথডটি রিকোয়েস্ট হ্যান্ডলার চালানোর পর এবং ভিউ রেন্ডার করার আগে চলে।
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):- এই মেথডটি রিকোয়েস্ট প্রক্রিয়াকরণের পর এবং ভিউ রেন্ডার করার পর চলে।
HandlerInterceptor এর উদাহরণ:
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomHandlerInterceptor implements HandlerInterceptor {
// Pre-handle: Request processing before handler (controller) is invoked
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre-handle: Request received for " + request.getRequestURI());
return true; // Continue processing the request
}
// Post-handle: After handler method is executed, before the view is rendered
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post-handle: Model and view are available, response is being prepared.");
}
// After completion: After the complete request-response cycle
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("After completion: Request processing is complete.");
}
}
HandlerInterceptor কনফিগার করা:
HandlerInterceptor ব্যবহার করতে হলে, প্রথমে এটি Spring MVC কনফিগারেশনে নিবন্ধিত করতে হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public CustomHandlerInterceptor customHandlerInterceptor() {
return new CustomHandlerInterceptor();
}
// Registering the custom interceptor
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customHandlerInterceptor())
.addPathPatterns("/**") // Apply to all requests
.excludePathPatterns("/login", "/public/**"); // Exclude specific paths
}
}
এখানে:
addPathPatterns("/**"): সমস্ত রিকোয়েস্টে ইন্টারসেপ্টর কার্যকর হবে।excludePathPatterns("/login", "/public/**"): নির্দিষ্ট রিকোয়েস্ট পাথগুলো বাদ দেওয়া হচ্ছে।
২. @WebMvcConfigurerAdapter
@WebMvcConfigurerAdapter একটি অ্যাবস্ট্রাক্ট ক্লাস যা WebMvcConfigurer ইন্টারফেসের কিছু মেথড বাস্তবায়ন করতে সহজ করে তোলে। Spring 5 থেকে @EnableWebMvc অ্যানোটেশনের পরিবর্তে WebMvcConfigurer ব্যবহারের পরামর্শ দেওয়া হয়েছে, যাতে কনফিগারেশনগুলো আরও সহজ এবং নির্দিষ্ট ভাবে করা যায়।
@WebMvcConfigurerAdapter এখন অব্যবহৃত (deprecated), এবং এর জায়গায় WebMvcConfigurer ব্যবহৃত হয়।
WebMvcConfigurer এর ব্যবহার:
WebMvcConfigurer ইন্টারফেসের মাধ্যমে আমরা Spring MVC কনফিগারেশনের বিভিন্ন অংশ কাস্টমাইজ করতে পারি, যেমন:
- ইন্টারসেপ্টর যুক্ত করা
- ফর্ম ইন্টারনাল ফরম্যাটার কনফিগার করা
- স্ট্যাটিক রিসোর্সের জন্য কনফিগারেশন করা
- HTTP কনভার্সন সাপোর্ট করা ইত্যাদি।
WebMvcConfigurer উদাহরণ:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@Configuration
public class WebConfig implements WebMvcConfigurer {
// Registering the custom interceptor
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login", "/public/**");
}
// Example of adding custom argument resolvers, message converters, etc.
// Other customizations can be added here
}
এখানে:
WebMvcConfigurerইন্টারফেস বাস্তবায়ন করেaddInterceptorsমেথডে কাস্টম ইন্টারসেপ্টর যুক্ত করা হয়েছে।
@WebMvcConfigurer এবং HandlerInterceptor এর পার্থক্য
| বৈশিষ্ট্য | HandlerInterceptor | WebMvcConfigurer |
|---|---|---|
| ব্যবহার | রিকোয়েস্ট-রেসপন্স সাইকেলের নির্দিষ্ট সময়ে কাস্টম লজিক প্রয়োগ করতে | Spring MVC কনফিগারেশন কাস্টমাইজ করতে (যেমন ইন্টারসেপ্টর, ফর্ম্যাটার ইত্যাদি) |
| প্রধান উদ্দেশ্য | রিকোয়েস্ট হ্যান্ডলার প্রক্রিয়াকরণের আগে বা পরে কাজ করা | Spring MVC কনফিগারেশন সামগ্রিকভাবে কাস্টমাইজ করা |
| অ্যানোটেশন/ক্লাস | HandlerInterceptor ইন্টারফেস | @Configuration ক্লাস, WebMvcConfigurer ইন্টারফেস |
| নির্দিষ্ট সময় | রিকোয়েস্ট প্রসেসিং শুরু হওয়া বা শেষে | অ্যাপ্লিকেশন স্টার্টআপে কনফিগারেশন করা |
উপসংহার
HandlerInterceptor: HTTP রিকোয়েস্ট-রেসপন্স চেইনের মধ্যে কাস্টম লজিক প্রয়োগ করার জন্য ব্যবহৃত হয়। এটি রিকোয়েস্ট প্রক্রিয়াকরণের শুরু, মাঝখানে বা শেষে কার্যকর হতে পারে এবং এটি Spring MVC কন্ট্রোলারের পূর্বে, পরে বা এক্সেপশন হ্যান্ডলিংয়ের সময় কাজ করতে পারে।WebMvcConfigurer: Spring MVC কনফিগারেশন কাস্টমাইজ করার জন্য ব্যবহৃত হয়। এটি ইন্টারসেপ্টর, ফর্ম্যাটার, স্ট্যাটিক রিসোর্স, HTTP কনভার্সন, এবং অন্যান্য কনফিগারেশন অপশন কাস্টমাইজ করতে সাহায্য করে।
এই দুটি উপাদান একসাথে Spring MVC অ্যাপ্লিকেশনে ক্রস-কাটিং কনসার্নগুলির বাস্তবায়ন করতে অত্যন্ত কার্যকর।
Read more