Interceptors হল Spring MVC-এর একটি শক্তিশালী বৈশিষ্ট্য যা HTTP রিকোয়েস্ট এবং রেসপন্সের মধ্যবর্তী পর্যায়ে কাজ করে। এটি কন্ট্রোলার প্রক্রিয়াকরণের আগে এবং পরে একটি রিকোয়েস্টের উপর কার্যকলাপ পরিচালনা করতে সহায়ক হয়। সাধারণত, Interceptors লগিং, অথেন্টিকেশন, অনুমোদন, অথবা মডেল/রেসপন্স তথ্য পরিবর্তন করার জন্য ব্যবহৃত হয়।
Interceptors এর মূল ব্যবহার:
- Logging: রিকোয়েস্ট এবং রেসপন্স লগ করা।
- Authentication: ব্যবহারকারী অথেন্টিকেশন যাচাই করা।
- Authorization: ব্যবহারকারী রোল চেক করা।
- Modifying Model/Data: রিকোয়েস্ট বা রেসপন্স মডেলে ডেটা যুক্ত করা বা পরিবর্তন করা।
- Performance Monitoring: রিকোয়েস্ট এবং রেসপন্সের সময় ট্র্যাক করা।
Spring MVC তে Interceptor তৈরি করা
Spring MVC তে Interceptor তৈরি করতে, HandlerInterceptor ইন্টারফেস ব্যবহার করা হয়। একটি কাস্টম ইন্টারসেপ্টর তৈরি করার জন্য এই ইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে।
Step 1: HandlerInterceptor ইন্টারফেস ইমপ্লিমেন্ট করা
CustomInterceptor.java (Interceptor উদাহরণ):
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomInterceptor implements HandlerInterceptor {
// রিকোয়েস্ট আসার আগে এটি কল হয়
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("PreHandle: Request Intercepted");
return true; // যদি false রিটার্ন করা হয়, তবে কন্ট্রোলারের মেথড কল হবে না
}
// রিকোয়েস্ট প্রসেস করার পরে এটি কল হয়
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception {
System.out.println("PostHandle: Response Intercepted");
}
// রিকোয়েস্ট সম্পূর্ণ প্রক্রিয়া হওয়ার পরে এটি কল হয়
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("AfterCompletion: Request Completed");
}
}
ব্যাখ্যা:
- preHandle: এটি কন্ট্রোলারের মেথড কল হওয়ার আগে কার্যকর হয়। এখানে আপনি রিকোয়েস্ট যাচাই বা লগিং করতে পারেন।
- postHandle: এটি কন্ট্রোলারের মেথড কল হওয়ার পরে কার্যকর হয়, তবে ভিউ রেন্ডারিংয়ের আগে।
- afterCompletion: রিকোয়েস্ট প্রক্রিয়া সম্পূর্ণ হওয়ার পরে এটি কার্যকর হয়। এটি সাধারণত রিসোর্স ক্লিনআপের জন্য ব্যবহৃত হয়।
Step 2: Interceptor কে কনফিগার করা
Interceptors কে Spring MVC কনফিগারেশনে রেজিস্টার করতে হবে। এটি WebMvcConfigurer ইন্টারফেসের মাধ্যমে করা হয়।
WebConfig.java (Interceptor কনফিগারেশন):
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 {
// Interceptor কে রেজিস্টার করা
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor()) // CustomInterceptor রেজিস্টার করা
.addPathPatterns("/**") // এই প্যাটার্নে সব URL-এ এটি অ্যাপ্লাই হবে
.excludePathPatterns("/login"); // login URL তে এটি কার্যকর হবে না
}
}
ব্যাখ্যা:
addInterceptor(new CustomInterceptor()): এটি আমাদের কাস্টম ইন্টারসেপ্টরকে রেজিস্টার করে।addPathPatterns("/**"): এটি সমস্ত URL পাথের জন্য ইন্টারসেপ্টর কার্যকর করে।excludePathPatterns("/login"): এই URL-এ ইন্টারসেপ্টর কার্যকর হবে না।
Step 3: Controller তৈরি
এখন, একটি কন্ট্রোলার তৈরি করতে পারেন যেটি এই ইন্টারসেপ্টর দ্বারা প্রভাবিত হবে।
HomeController.java (Controller উদাহরণ):
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/home")
public String homePage() {
return "home"; // "home.jsp" ভিউ রিটার্ন করবে
}
@GetMapping("/login")
public String loginPage() {
return "login"; // login.jsp ভিউ রিটার্ন করবে
}
}
ব্যাখ্যা:
/homeপাথের জন্য রিকোয়েস্ট আসলেhomePage()মেথড কল হবে এবং কন্ট্রোলারের মাধ্যমে রিটার্ন হওয়া ভিউ রেন্ডার হবে।/loginURL-এ ইন্টারসেপ্টর কার্যকর হবে না কারণ আমরাexcludePathPatterns("/login")কনফিগার করেছি।
Step 4: View তৈরি
এখানে একটি home.jsp এবং login.jsp ভিউ তৈরি করা হচ্ছে।
home.jsp:
<!DOCTYPE html>
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Welcome to Spring MVC Home Page!</h1>
</body>
</html>
login.jsp:
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h1>Please login to access the site.</h1>
</body>
</html>
Step 5: Running the Application
Spring Boot ব্যবহার করলে, @SpringBootApplication অ্যানোটেশন দিয়ে আপনি অ্যাপ্লিকেশন রান করতে পারেন। উদাহরণ:
Application.java (Spring Boot উদাহরণ):
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
অথবা যদি আপনি সাধারণ Spring Framework ব্যবহার করেন, আপনি Tomcat বা অন্য কোনও Servlet Container-এ অ্যাপ্লিকেশন চালাতে পারবেন।
Spring MVC Interceptors এর সুবিধা:
- Cross-Cutting Concerns: লগিং, সিকিউরিটি, অথবা পারফরম্যান্স মেট্রিক্স ট্র্যাকিংয়ের মতো ক্রস-কাটিং কনসার্নসের জন্য ইন্টারসেপ্টর খুবই উপকারী।
- Request Pre-processing and Post-processing: রিকোয়েস্ট প্রক্রিয়া করার আগে এবং পরে প্রক্রিয়াকরণ করা সম্ভব।
- Custom Logic: কাস্টম অথেন্টিকেশন, অনুমোদন যাচাই বা ডেটা পরিবর্তনের মতো কার্যকলাপ সহজে করতে পারেন।
- Global Interceptors: আপনি গ্লোবালি সব কন্ট্রোলারে ইন্টারসেপ্টর ব্যবহার করতে পারেন।
উপসংহার:
Spring MVC তে Interceptors কন্ট্রোলার প্রক্রিয়ার আগে বা পরে HTTP রিকোয়েস্ট এবং রেসপন্সে অতিরিক্ত লজিক বা প্রক্রিয়া যোগ করতে সহায়ক। এটি সাধারণত লগিং, অথেন্টিকেশন, অনুমোদন, ডেটা পরিবর্তন বা অন্য যেকোনো ক্রস-কাটিং কার্যকলাপের জন্য ব্যবহৃত হয়। Spring MVC তে ইন্টারসেপ্টর কনফিগারেশন সহজ এবং নমনীয়, যা ব্যবহারকারীদের বিভিন্ন ওয়েব অ্যাপ্লিকেশনে ব্যবহারের জন্য এক্সটেনসিভ ফিচার প্রদান করে।
Interceptor হল Spring MVC এর একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান যা HTTP রিকোয়েস্ট এবং রেসপন্সের মধ্যে মধ্যবর্তী স্তরে কাজ করে। Interceptor একটি কাস্টম লজিক প্রয়োগ করতে সক্ষম যা রিকোয়েস্ট বা রেসপন্সের আগে বা পরে নির্দিষ্ট কাজ করে। Interceptors সাধারণত লগিং, নিরাপত্তা যাচাইকরণ, পারফরম্যান্স মনিটরিং, এবং কাস্টম রিসপন্স প্রসেসিং সহ বিভিন্ন কাজে ব্যবহৃত হয়।
Interceptor কী?
Interceptor হল একটি সুনির্দিষ্ট উপাদান যা Spring MVC অ্যাপ্লিকেশনকে আরও কাস্টমাইজ এবং নিয়ন্ত্রণ করতে সাহায্য করে। এটি একটি HandlerInterceptor ইন্টারফেস ইমপ্লিমেন্টেশন যা Spring MVC ফ্রেমওয়ার্কের ফিল্টার চেইন অংশ হিসেবে কাজ করে এবং রিকোয়েস্ট প্রসেসিং শুরু হওয়ার পূর্বে বা রেসপন্স পাঠানোর পর বিভিন্ন কাজ করতে পারে।
Interceptor প্রায়শই logging, authentication বা authorization, performance monitoring, এবং data modification এর মতো প্রয়োজনীয় কাজের জন্য ব্যবহৃত হয়।
Interceptor এর ভূমিকা
Spring MVC তে Interceptor এর মূল ভূমিকা হচ্ছে:
- Request Pre-processing: রিকোয়েস্ট আসার আগে কিছু কাস্টম কাজ করা (যেমন, লগিং, ইউজার অথেন্টিকেশন চেক করা ইত্যাদি)।
- Post-processing: রিকোয়েস্ট হ্যান্ডল করার পরে (কন্ট্রোলার থেকে রেসপন্স পাওয়ার পর) কিছু কাজ করা।
- Cleaning up: রেসপন্স পাঠানোর পর ক্লিনআপ বা অন্যান্য কাজ করা।
Interceptor মূলত Handler (যেমন কন্ট্রোলার মেথড) এর আগে বা পরে প্রসেসিং করতে পারে, তবে এটি সাধারণত before এবং after hooks প্রদান করে।
Interceptor-র মূল কার্যাবলি:
- Pre-handle:
- এটি রিকোয়েস্ট আসার আগে কাজ করে।
- এখানে আপনি ইউজারের অথেন্টিকেশন চেক করতে পারেন, লগিং করতে পারেন বা অন্য কোন প্রি-প্রসেসিং কাজ করতে পারেন।
- Post-handle:
- এটি কন্ট্রোলার বা অন্য কোন কম্পোনেন্ট থেকে রেসপন্স আসার পর কাজ করে।
- উদাহরণস্বরূপ, কন্ট্রোলারের রেসপন্স প্রক্রিয়াকরণের পর কিছু কাস্টম লজিক প্রয়োগ করা।
- After-completion:
- এটি পুরো রিকোয়েস্ট-রেসপন্স প্রসেস শেষ হওয়ার পর কাজ করে।
- এটি ক্লিনআপ, লগিং বা অন্যান্য অবশেষ কাজের জন্য ব্যবহৃত হতে পারে।
Spring MVC Interceptor কনফিগারেশন এবং উদাহরণ
ধাপ 1: Interceptor ইমপ্লিমেন্ট করা
Spring MVC তে Interceptor ইমপ্লিমেন্ট করতে হলে, HandlerInterceptor ইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে।
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
// Pre-handle: Request আসার আগে কাজ করবে
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Request is being processed in preHandle");
return true; // Return true to allow the request to proceed
}
// Post-handle: Controller থেকে রেসপন্স আসার পরে কাজ করবে
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Request has been processed in postHandle");
}
// After-completion: Request-Response প্রসেস শেষ হওয়ার পরে কাজ করবে
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Request and Response is completed in afterCompletion");
}
}
এখানে:
preHandle: রিকোয়েস্ট আসার আগে কিছু কাজ করতে ব্যবহৃত হয়। এটিtrueরিটার্ন করলে রিকোয়েস্ট প্রসেস করতে দেয়া হয়, কিন্তুfalseরিটার্ন করলে রিকোয়েস্ট থামিয়ে দেয়া হবে।postHandle: কন্ট্রোলার থেকে রেসপন্স আসার পর কিছু কাজ করতে ব্যবহৃত হয়।afterCompletion: পুরো রিকোয়েস্ট-রেসপন্স প্রক্রিয়াটি সম্পন্ন হওয়ার পর শেষের কাজগুলো করা হয় (যেমন ক্লিনআপ বা লগিং)।
ধাপ 2: Spring MVC কনফিগারেশন ক্লাসে Interceptor রেজিস্টার করা
Spring MVC তে Interceptor ব্যবহার করতে WebMvcConfigurerAdapter (বা WebMvcConfigurer) কনফিগারেশন ক্লাসে ইন্টারসেপ্টরটি রেজিস্টার করতে হয়।
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
// Add custom interceptor to the Spring MVC interceptor chain
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // Apply to all paths
}
}
এখানে:
addInterceptor(new MyInterceptor()): নতুন ইন্টারসেপ্টর যোগ করা হয়।addPathPatterns("/**"): ইন্টারসেপ্টরটি সমস্ত URL পাথের জন্য কার্যকর হবে।
আপনি চাইলে নির্দিষ্ট পাথ বা URL-এ ইন্টারসেপ্টরটি সীমিত করতে পারেন।
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/admin/**"); // Only for /admin URLs
Interceptor এর ব্যবহারের কিছু সাধারণ ক্ষেত্র:
- লগিং:
- ইউজারের রিকোয়েস্ট এবং রেসপন্সের ডেটা লগ করা। যেমন, কনসোল বা ফাইলের মধ্যে লগ লেখার জন্য।
- Authentication এবং Authorization:
- ইউজারের অথেন্টিকেশন এবং অনুমোদন যাচাই করতে ব্যবহৃত হয়, যেমন Session-based বা Token-based অথেন্টিকেশন চেক করা।
- রেট লিমিটিং:
- সার্ভারের উপর অতিরিক্ত লোড কমানোর জন্য রিকোয়েস্টের সংখ্যা সীমিত করা।
- ডেটা মডিফিকেশন:
- রিকোয়েস্ট বা রেসপন্সের ডেটা পরিবর্তন বা ফিল্টার করা। যেমন, রেসপন্সে কাস্টম ডেটা যোগ করা বা কিছু তথ্য অপসারণ করা।
Spring MVC Interceptor এর সুবিধা
- কোডের পুনঃব্যবহারযোগ্যতা:
- সাধারণ কার্যাবলী যেমন লগিং, অথেন্টিকেশন চেক ইত্যাদি বিভিন্ন কন্ট্রোলার বা রিকোয়েস্টে পুনঃব্যবহার করা যায়।
- লজিকের বিচ্ছিন্নতা:
- কমপ্লেক্স লজিককে ইন্টারসেপ্টর দিয়ে পৃথক করে রাখা যায়, ফলে কন্ট্রোলার কোড পরিষ্কার এবং সংক্ষিপ্ত থাকে।
- সম্পূর্ণ রিকোয়েস্ট-রেসপন্স প্রক্রিয়া নিয়ন্ত্রণ:
- ইন্টারসেপ্টরগুলি রিকোয়েস্ট এবং রেসপন্সের মধ্যবর্তী স্তরে কাজ করে, ফলে আপনি পুরো প্রক্রিয়ার উপর পূর্ণ নিয়ন্ত্রণ রাখতে পারেন।
উপসংহার
Spring MVC তে Interceptor একটি শক্তিশালী উপাদান যা আপনাকে HTTP রিকোয়েস্ট এবং রেসপন্সের উপর সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে। এটি লগিং, অথেন্টিকেশন, রেট লিমিটিং, এবং ডেটা প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। Interceptor এর মাধ্যমে আপনার অ্যাপ্লিকেশন আরও নিরাপদ, স্কেলেবল এবং ম্যানেজেবল হতে পারে।
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 অ্যাপ্লিকেশনে ক্রস-কাটিং কনসার্নগুলির বাস্তবায়ন করতে অত্যন্ত কার্যকর।
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 একটি খুবই শক্তিশালী বৈশিষ্ট্য, যা আপনাকে রিকোয়েস্টের বিভিন্ন ধাপে হস্তক্ষেপ করার সুযোগ দেয়। আপনি এই ইন্টারসেপ্টরগুলি ব্যবহার করে লগিং, অথেনটিকেশন, অথরাইজেশন, ফর্ম ভ্যালিডেশন এবং অনেক ধরনের প্রসেসিং কার্যক্রম সহজে করতে পারেন।
Spring MVC তে Interceptors ব্যবহৃত হয় HTTP রিকোয়েস্টের প্রতি কিছু কাজ বা প্রক্রিয়া সম্পাদন করার জন্য, যেমন লগিং, অথেনটিকেশন, অথরাইজেশন বা রিকোয়েস্ট মডিফিকেশন। Interceptors আপনাকে একটি হুক প্রদান করে যা Controller এর মধ্যে আসার আগে বা পরে কাজ করতে পারে।
Spring MVC তে Interceptors তৈরি করার জন্য, আপনাকে HandlerInterceptor ইন্টারফেস ইমপ্লিমেন্ট করতে হয়। এখানে একটি উদাহরণ দেওয়া হয়েছে যেখানে আপনি Spring MVC Interceptor তৈরি এবং কনফিগার করবেন।
Step 1: Interceptor Interface
Spring MVC তে HandlerInterceptor ইন্টারফেসের ৩টি প্রধান মেথড থাকে:
preHandle(): রিকোয়েস্ট প্রোসেসিংয়ের আগে কল করা হয়।postHandle(): রিকোয়েস্ট প্রোসেসিংয়ের পরে, কিন্তু রেসপন্স পাঠানোর আগে কল করা হয়।afterCompletion(): রিকোয়েস্ট প্রোসেসিং শেষে এবং রেসপন্স পাঠানোর পর কল করা হয়।
এখানে একটি সাধারণ Interceptor তৈরি করা হয়েছে যা রিকোয়েস্টের আগে এবং পরে কাজ করবে।
Step 2: Interceptor Implementation
package com.example.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
// Called before the controller method is invoked
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre Handle method is Calling");
// Returning true allows the request to proceed to the controller
return true;
}
// Called after the controller method is invoked, but before the response is sent
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception {
System.out.println("Post Handle method is Calling");
}
// Called after the complete request has finished
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Request and Response is completed");
}
}
Explanation:
preHandle(): এই মেথডে আপনি রিকোয়েস্ট আসার আগে যেকোনো কাজ করতে পারেন, যেমন লগিং, অথেনটিকেশন চেক।postHandle(): এই মেথডে আপনি কন্ট্রোলার প্রোসেসিংয়ের পর কাজ করতে পারেন, কিন্তু রেসপন্স ফেরত দেওয়ার আগে।afterCompletion(): রিকোয়েস্ট সম্পূর্ণ হওয়ার পর কাজ করতে পারেন, যেমন লগিং বা রিসোর্স ক্লিনআপ।
Step 3: Register the Interceptor
Spring MVC তে Interceptor রেজিস্টার করতে, আপনাকে WebMvcConfigurer ইন্টারফেস ইমপ্লিমেন্ট করতে হবে এবং addInterceptors() মেথডে Interceptor রেজিস্টার করতে হবে।
package com.example.config;
import com.example.interceptor.MyInterceptor;
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) {
// Register the interceptor for all requests
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // Apply to all URLs
.excludePathPatterns("/login", "/register"); // Exclude certain URLs if needed
}
}
Explanation:
addInterceptor(): এই মেথডে আপনি আপনার কাস্টম ইন্টারসেপ্টর যোগ করেন।addPathPatterns("/**"): সমস্ত URL পাথের জন্য ইন্টারসেপ্টর অ্যাপ্লাই করতে।excludePathPatterns("/login", "/register"): কিছু URL থেকে ইন্টারসেপ্টর অযোগ্য করতে (যেমন লগইন বা রেজিস্ট্রেশন পেজ)।
Step 4: Create a Simple Controller
এখন একটি সাধারণ কন্ট্রোলার তৈরি করি যা Interceptor দ্বারা ইন্টারসেপ্টেড হবে।
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/home")
public String home() {
System.out.println("Home method is called");
return "home"; // Return a view name
}
@GetMapping("/about")
public String about() {
System.out.println("About method is called");
return "about"; // Return a view name
}
}
Explanation:
@GetMapping("/home"): এই রিকোয়েস্টেhomeমেথড কল হবে এবং ইন্টারসেপ্টর হ্যান্ডেল করবে।@GetMapping("/about"): এই রিকোয়েস্টেaboutমেথড কল হবে এবং ইন্টারসেপ্টর হ্যান্ডেল করবে।
Step 5: Configure Views
এখন আপনাকে দুটি জিপিএস পৃষ্ঠা তৈরি করতে হবে যা /home এবং /about রিকোয়েস্টে রিটার্ন হবে।
home.jsp (Located at /WEB-INF/views/home.jsp):
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Welcome to the Home Page!</h1>
</body>
</html>
about.jsp (Located at /WEB-INF/views/about.jsp):
<html>
<head>
<title>About Page</title>
</head>
<body>
<h1>Welcome to the About Page!</h1>
</body>
</html>
Step 6: Run and Test the Application
- Run your application (Spring Boot or traditional Spring MVC).
- Access the URLs:
- Open the browser and navigate to
http://localhost:8080/homeandhttp://localhost:8080/about. - You will see the messages printed in the console from both
MyControllerandMyInterceptorshowing the flow through the interceptor.
- Open the browser and navigate to
Console Output Example:
Pre Handle method is Calling
Home method is called
Post Handle method is Calling
Request and Response is completed
Conclusion
Spring MVC তে Interceptors আপনাকে রিকোয়েস্ট এবং রেসপন্সের চক্রে কিছু কাস্টম লজিক যোগ করার সুযোগ দেয়। আপনি HandlerInterceptor ইন্টারফেস ইমপ্লিমেন্ট করে রিকোয়েস্ট আসার আগে, পরে, বা প্রক্রিয়াকরণ শেষ হওয়ার পর কাজ করতে পারেন। এর মাধ্যমে আপনি লগিং, অথেনটিকেশন, অথরাইজেশন, বা রিকোয়েস্ট মডিফিকেশন করতে পারবেন। Interceptor ব্যবহার করার মাধ্যমে আপনার Spring MVC অ্যাপ্লিকেশন আরও শক্তিশালী এবং কাস্টমাইজেবল হতে পারে।
Read more