Spring MVC তে Request Interception একটি শক্তিশালী বৈশিষ্ট্য যা আপনি pre-processing (রিকোয়েস্টের আগে), post-processing (রিকোয়েস্টের পরে), এবং cleanup (রিকোয়েস্ট সম্পন্ন হওয়ার পরে) করার জন্য ব্যবহার করতে পারেন। এটি সাধারণত HandlerInterceptor ইন্টারফেসের মাধ্যমে কাজ করে, যা preHandle(), postHandle(), এবং afterCompletion() মেথডগুলির মাধ্যমে পরিচালিত হয়।
এই ইন্টারসেপ্টরগুলি আপনাকে রিকোয়েস্ট প্রসেসিংয়ের বিভিন্ন ধাপে হস্তক্ষেপ করতে সহায়তা করে, যেমন:
- Pre-Handle: রিকোয়েস্ট প্রসেসিং শুরুর আগে কাজ করে।
- Post-Handle: রিকোয়েস্ট প্রসেসিংয়ের পরে, তবে ভিউ রেন্ডার করার আগে কাজ করে।
- After-Completion: রিকোয়েস্ট সম্পন্ন হওয়ার পরে, ভিউ রেন্ডার হওয়ার পরে কাজ করে।
এখানে, HandlerInterceptor ইন্টারফেসের ব্যবহার এবং এর তিনটি মেথডের মাধ্যমে রিকোয়েস্ট ইন্টারসেপ্ট করার উদাহরণ দেওয়া হলো।
১. HandlerInterceptor ইন্টারফেস এবং মেথডগুলো
HandlerInterceptor ইন্টারফেসে তিনটি মেথড থাকে:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):- এই মেথডটি request প্রসেসিং শুরু হওয়ার আগে চালানো হয়। এটি সাধারণত authentication, logging, authorization, request validation ইত্যাদি কাজের জন্য ব্যবহার করা হয়।
- যদি
trueফেরত দেওয়া হয়, তবে রিকোয়েস্ট প্রসেসিং চালু থাকে, এবং যদিfalseফেরত দেওয়া হয়, তাহলে রিকোয়েস্ট প্রক্রিয়া থামানো হয়।
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):- এই মেথডটি request প্রসেসিং সম্পন্ন হওয়ার পরে, তবে ভিউ রেন্ডারিং করার আগে চালানো হয়। এটি সাধারণত view object modification বা response processing করার জন্য ব্যবহৃত হয়।
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):- এই মেথডটি request সম্পূর্ণ হওয়ার পরে, ভিউ রেন্ডার করার পর চালানো হয়। এটি সাধারণত cleanup, logging, error handling ইত্যাদি কাজের জন্য ব্যবহৃত হয়।
২. Custom HandlerInterceptor তৈরি করা
HandlerInterceptor ইন্টারফেস ইমপ্লিমেন্ট করার মাধ্যমে আপনি কাস্টম ইন্টারসেপ্টর তৈরি করতে পারেন যা রিকোয়েস্টের বিভিন্ন পর্যায়ে হস্তক্ষেপ করবে।
উদাহরণ:
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor extends HandlerInterceptorAdapter {
// Pre-handle method: runs before the request is processed
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("PreHandle - Request URL: " + request.getRequestURL());
// You can do authentication, logging, etc.
// Returning true will allow the request to continue, false will stop it.
return true; // Allow the request to proceed
}
// Post-handle method: runs after the request is processed, but before the view is rendered
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("PostHandle - View name: " + modelAndView.getViewName());
// You can modify the ModelAndView object here, if necessary.
}
// After-completion method: runs after the request is completed and view is rendered
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("AfterCompletion - Request completed");
// Clean up resources, log information, etc.
}
}
ব্যাখ্যা:
preHandle(): এই মেথডটি রিকোয়েস্টের আগে কার্যকর হয় এবং আপনি এখানেই কাস্টম অথেনটিকেশন, অথরাইজেশন, বা লগিং করতে পারেন।postHandle(): এই মেথডটি রিকোয়েস্টের পর এবং ভিউ রেন্ডার করার আগে কার্যকর হয়। আপনি এখানে ভিউ-নির্ভর ডেটা অথবা রেসপন্স প্রসেসিং করতে পারেন।afterCompletion(): এই মেথডটি সম্পূর্ণরূপে রিকোয়েস্ট প্রক্রিয়া শেষ হওয়ার পরে কার্যকর হয়, এবং এটি সাধারণত লগিং বা ক্লিনআপ কাজের জন্য ব্যবহৃত হয়।
৩. ইন্টারসেপ্টর কনফিগারেশন
Spring MVC তে, কাস্টম ইন্টারসেপ্টর কনফিগার করতে, আপনি WebMvcConfigurer ইন্টারফেসের মাধ্যমে ইন্টারসেপ্টরকে রেজিস্টার করতে হবে।
উদাহরণ:
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 {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()) // Registering the custom interceptor
.addPathPatterns("/**") // Intercepts all requests
.excludePathPatterns("/login", "/register"); // Exclude specific paths from being intercepted
}
}
ব্যাখ্যা:
addInterceptors(): এই মেথডটি কাস্টম ইন্টারসেপ্টরটি রেজিস্টার করতে ব্যবহৃত হয়।addPathPatterns("/**"): এটি সমস্ত রিকোয়েস্টের জন্য ইন্টারসেপ্টরটি প্রয়োগ করবে।excludePathPatterns("/login", "/register"): এখানে নির্দিষ্ট কিছু রিকোয়েস্ট URL (যেমন/loginবা/register) থেকে ইন্টারসেপ্টর প্রভাবিত হবে না।
৪. ইন্টারসেপ্টর কার্যপ্রণালী
- PreHandle: রিকোয়েস্ট আসার আগেই কার্যকর হয়। এটি সাধারণত লগিং, অথেনটিকেশন, অথবা রিকোয়েস্ট ভ্যালিডেশন এর জন্য ব্যবহৃত হয়।
- PostHandle: রিকোয়েস্ট প্রসেস হওয়ার পর এবং ভিউ রেন্ডার হওয়ার আগে কার্যকর হয়। আপনি এখানে ভিউতে ডেটা যোগ বা মডিফাই করতে পারেন।
- AfterCompletion: রিকোয়েস্ট সম্পন্ন হওয়ার পরে কার্যকর হয়। এটি সাধারণত ক্লিনআপ বা লোগিং কাজের জন্য ব্যবহৃত হয়।
৫. HandlerInterceptor এর সুবিধা
- Request Validation: রিকোয়েস্ট আসার আগে আপনার ফর্ম বা ডেটা ভ্যালিডেশন করা।
- Logging: লগিং করার জন্য ইন্টারসেপ্টর খুবই কার্যকরী, যেমন রিকোয়েস্টের URL, ইউজার অ্যাক্সেস টাইম, ইত্যাদি।
- Authentication and Authorization: ইউজারের অথেনটিকেশন এবং অথরাইজেশন চেক করা।
- Request Modification: আপনি রিকোয়েস্টে বা রেসপন্সে ডেটা মডিফাই করতে পারেন।
উপসংহার
Spring MVC তে PreHandle, PostHandle, এবং AfterCompletion মেথডের মাধ্যমে Request Interception একটি খুবই শক্তিশালী বৈশিষ্ট্য, যা আপনাকে রিকোয়েস্টের বিভিন্ন ধাপে হস্তক্ষেপ করার সুযোগ দেয়। আপনি এই ইন্টারসেপ্টরগুলি ব্যবহার করে লগিং, অথেনটিকেশন, অথরাইজেশন, ফর্ম ভ্যালিডেশন এবং অনেক ধরনের প্রসেসিং কার্যক্রম সহজে করতে পারেন।
Read more