Interceptor হল Struts 2 এর একটি শক্তিশালী বৈশিষ্ট্য যা অ্যাকশন ক্লাসের প্রক্রিয়া এবং এর রিকোয়েস্ট এবং রেসপন্সের উপর প্রি-প্রসেসিং এবং পোস্ট-প্রসেসিং করতে ব্যবহৃত হয়। এটি মূলত একটি ফিল্টার বা মধ্যবর্তী স্তরের (middleware) মতো কাজ করে যা অ্যাকশন লজিকের আগে বা পরে একাধিক কাজ পরিচালনা করতে পারে।
Interceptor কি?
Struts 2 এ Interceptor হল এমন একটি প্রক্রিয়া যা রিকোয়েস্টের আগেই বা পরেই কার্যকর হয় এবং এর মাধ্যমে আমরা বিভিন্ন ধরনের ক্রস-কাটিং কনসার্ন (যেমন লগিং, অথেন্টিকেশন, অথরাইজেশন, ভ্যালিডেশন) পরিচালনা করতে পারি। ইন্টারসেপ্টরগুলি Action ক্লাসের মধ্যে বা অ্যাকশন ক্লাসের চলার আগে অথবা পরে সঞ্চালিত হতে পারে।
কাজের প্রক্রিয়া:
- Pre-processing: এটি ইনপুট প্রক্রিয়াকরণের আগে অ্যাকশন ক্লাসে কার্যকর হয়। উদাহরণস্বরূপ, সেশন যাচাই, অথেন্টিকেশন বা লগিং এর কাজ।
- Post-processing: এটি অ্যাকশন ক্লাসের কাজ শেষ হওয়ার পরে কার্যকর হয়। উদাহরণস্বরূপ, আউটপুট পরিবর্তন করা বা রেসপন্স চেক করা।
Struts 2 এ Interceptor কিভাবে কাজ করে?
Struts 2 ফ্রেমওয়ার্কে, যখন একটি রিকোয়েস্ট অ্যাকশন ক্লাসের মাধ্যমে প্রসেস করা হয়, তখন সেই রিকোয়েস্টটি বিভিন্ন Interceptor Stack এর মাধ্যমে চলে। যখনই একটি রিকোয়েস্ট অ্যাকশনের জন্য প্রক্রিয়া শুরু হয়, প্রথমে Struts 2 ইন্টারসেপ্টর স্ট্যাকের মাধ্যমে যাচাই করে।
এটি যে কোনও রিকোয়েস্ট এবং রেসপন্স হ্যান্ডলিং ফিচারের জন্য অত্যন্ত কার্যকরী, যেমন:
- Security Checks (অথেন্টিকেশন বা অথরাইজেশন)
- Logging (লগিং)
- Validation (ভ্যালিডেশন)
- Session Management (সেশন পরিচালনা)
Interceptor এর কাঠামো
Struts 2 Interceptor সাধারণত দুটি মেথডের মধ্যে কাজ করে:
intercept(): এটি ইন্টারসেপ্টরের মূল মেথড যা কাস্টম কাজ বা প্রক্রিয়া সম্পাদন করে।stack: এটি পরবর্তী ইন্টারসেপ্টর অথবা অ্যাকশন প্রসেসিংকে কল করে। আপনার প্রক্রিয়া সম্পন্ন হওয়ার পর আপনিstack.invoke()কল করে পরবর্তী প্রক্রিয়া শুরু করতে পারেন।
Interceptor এর প্রয়োজনীয়তা
Struts 2 এ Interceptor ব্যবহার করার প্রয়োজনীয়তা অনেক কারণে রয়েছে, যেমন:
- ক্রস-কাটিং কনসার্ন (Cross-cutting Concerns): Interceptors ব্যবহার করে আপনি ক্রস-কাটিং কনসার্ন যেমন লগিং, অথেন্টিকেশন, ভ্যালিডেশন ইত্যাদি কেন্দ্রীভূতভাবে পরিচালনা করতে পারেন। এতে কোডের পুনঃব্যবহারযোগ্যতা এবং কাস্টমাইজেশন সুবিধা পাওয়া যায়।
- কোডের পরিষ্কার এবং এক্সটেনসিবিলিটি: ইন্টারসেপ্টর ব্যবহার করলে কোড আরো পরিষ্কার হয় এবং মূল অ্যাকশন ক্লাসটি শুধুমাত্র তার নির্দিষ্ট কাজ করে, অন্য কোনো এক্সট্রা কাজের জন্য আলাদা ইন্টারসেপ্টর ব্যবহার করা হয়। এটি অ্যাপ্লিকেশনটির এক্সটেনসিবিলিটি বাড়ায়।
- রিকোয়েস্ট প্রক্রিয়াকরণকে কেন্দ্রীভূতভাবে নিয়ন্ত্রণ করা: ইন্টারসেপ্টরের মাধ্যমে আপনি একটি জায়গা থেকেই সমস্ত রিকোয়েস্ট প্রক্রিয়াকরণ কন্ট্রোল করতে পারেন, যেমন লগিং, অথেন্টিকেশন চেক, বা ভ্যালিডেশন ইত্যাদি কাজগুলি কাস্টম কনফিগারেশন বা স্ট্যাকের মাধ্যমে করা যায়।
- পুনঃব্যবহারযোগ্যতা (Reusability): একাধিক অ্যাকশন ক্লাসে একই ইন্টারসেপ্টর ব্যবহার করা সম্ভব। একবার ইন্টারসেপ্টর তৈরি করলে, তা বিভিন্ন অ্যাকশনে পুনঃব্যবহার করা যায়।
- সেশন ম্যানেজমেন্ট এবং অথেন্টিকেশন: ইন্টারসেপ্টর ব্যবহার করে আপনি সেশন যাচাই, অথেন্টিকেশন এবং অথরাইজেশন পরিচালনা করতে পারেন। এটি নিরাপত্তার দিক থেকে অত্যন্ত গুরুত্বপূর্ণ।
- ডিবাগিং এবং লগিং: ইন্টারসেপ্টর ব্যবহার করে আপনি ডিবাগিং, লগিং এবং অন্যান্য সাধারণ কার্যকলাপ সহজেই করতে পারেন। এটি ট্রান্সপারেন্সি বাড়ায় এবং ত্রুটির সমাধানে সহায়তা করে।
Struts 2 Interceptor উদাহরণ
ধরা যাক, একটি সিম্পল লগিং ইন্টারসেপ্টর তৈরি করা হচ্ছে, যা প্রতিটি রিকোয়েস্টের জন্য লগ তৈরি করবে।
1. LoggingInterceptor.java
package com.example;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoggingInterceptor implements Interceptor {
@Override
public void destroy() {
// Clean-up code, if needed
}
@Override
public void init() {
// Initialization code, if needed
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// Logging logic before action execution
System.out.println("Before Action Execution: " + invocation.getAction().getClass().getName());
// Proceed to the next interceptor or action
String result = invocation.invoke();
// Logging logic after action execution
System.out.println("After Action Execution: " + invocation.getAction().getClass().getName());
return result;
}
}
2. struts.xml (Interceptor Configuration)
<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="loggingInterceptor" class="com.example.LoggingInterceptor" />
<interceptor-stack name="defaultStack">
<interceptor-ref name="loggingInterceptor"/>
<interceptor-ref name="exceptionInterceptor"/>
<interceptor-ref name="validationInterceptor"/>
<interceptor-ref name="workflowInterceptor"/>
</interceptor-stack>
</interceptors>
<action name="hello" class="com.example.HelloWorldAction">
<result>/hello.jsp</result>
</action>
</package>
</struts>
এখানে, LoggingInterceptor ইন্টারসেপ্টরটি কনফিগার করা হয়েছে এবং এটি defaultStack ইন্টারসেপ্টর স্ট্যাকে যোগ করা হয়েছে। এর মাধ্যমে প্রতিটি রিকোয়েস্টের জন্য লগিং কার্যকর হবে।
সারাংশ
Interceptor হল Struts 2 এর একটি গুরুত্বপূর্ণ এবং শক্তিশালী বৈশিষ্ট্য যা আপনাকে অ্যাকশন ক্লাসের আগে বা পরে প্রি-প্রসেসিং এবং পোস্ট-প্রসেসিং কাজ করতে সাহায্য করে। এটি ক্রস-কাটিং কনসার্ন (যেমন লগিং, অথেন্টিকেশন, সেশন চেকিং, ভ্যালিডেশন) পরিচালনার জন্য অত্যন্ত কার্যকরী। Struts 2 এর মাধ্যমে Interceptor ব্যবহার করে আপনি অ্যাকশনের কোডকে পরিষ্কার রাখতে পারেন এবং একাধিক অ্যাকশন ক্লাসে একই ফিচার সহজভাবে পুনঃব্যবহার করতে পারেন।
Read more