Servlet Filter API একটি শক্তিশালী ফিচার যা সার্ভলেট কন্টেইনারে HTTP রিকোয়েস্ট এবং রেসপন্স প্রসেসিংয়ের সময় মধ্যবর্তী পর্যায়ে প্রক্রিয়া করতে ব্যবহৃত হয়। সার্ভলেট ফিল্টারগুলি মূলত সার্ভলেটের জন্য রিকোয়েস্ট আসার আগে এবং রেসপন্স যাওয়ার পরে বিভিন্ন কাজ করতে পারে, যেমন লগিং, অথেনটিকেশন, ডেটা এনক্রিপশন, ডিক্রিপশন, রিকোয়েস্ট মডিফিকেশন ইত্যাদি।
ফিল্টারগুলি Servlet এবং JSP (JavaServer Pages) এর সাথে কাজ করতে পারে, এবং এগুলি ওয়েব অ্যাপ্লিকেশনের সুরক্ষা, পারফরম্যান্স বা লগিং সংক্রান্ত ক্রস-কাটিং কনসার্নগুলি সমাধান করতে ব্যবহৃত হয়।
Filter API এর কাজ
Filter একটি ইন্টারফেস যা সার্ভলেট রিকোয়েস্ট এবং রেসপন্সের মধ্যবর্তী স্তরে বিভিন্ন প্রসেসিং কাজ করতে ব্যবহৃত হয়। ফিল্টার সাধারণত ৩টি প্রধান কাজ করে:
- Request Preprocessing:
- সার্ভলেট কল করার আগে ফিল্টারটি রিকোয়েস্টকে প্রক্রিয়া করতে পারে। যেমন: লগিং, অথেনটিকেশন যাচাই, রিকোয়েস্টের ডেটা ফিল্টার করা ইত্যাদি।
- Response Postprocessing:
- সার্ভলেট থেকে রেসপন্স আসার পর ফিল্টারটি রেসপন্সের উপর কাজ করতে পারে। যেমন: রেসপন্সে কিছু হেডার যোগ করা, রেসপন্স কম্প্রেশন, রেসপন্স মডিফিকেশন ইত্যাদি।
- Logging and Monitoring:
- ফিল্টার ব্যবহার করে অ্যাপ্লিকেশনের রিকোয়েস্ট এবং রেসপন্সের লগ রাখা যায়, যা মনিটরিং ও ডিবাগিংয়ে সহায়তা করে।
ফিল্টারের কাজ সাধারণত Chain of Responsibility প্যাটার্নের মতো হয়, যেখানে একাধিক ফিল্টার একে অপরের পর পর প্রক্রিয়া করে। এক ফিল্টারের কাজ শেষ হলে পরবর্তী ফিল্টার চলে আসে, এবং শেষে সার্ভলেট বা JSP কল হয়।
Filter API এর মূল মেথডসমূহ
javax.servlet.Filter ইন্টারফেসের তিনটি প্রধান মেথড থাকে:
doFilter():
- এটি রিকোয়েস্ট এবং রেসপন্স অবজেক্টের সাথে কাজ করে। ফিল্টারিং প্রক্রিয়া এবং পরবর্তী ফিল্টার বা সার্ভলেট কল করার জন্য এটি ব্যবহৃত হয়।
Syntax:
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;request: সার্ভলেট রিকোয়েস্ট অবজেক্ট।response: সার্ভলেট রেসপন্স অবজেক্ট।chain: ফিল্টার চেইনের পরবর্তী ফিল্টার বা সার্ভলেট কল করার জন্যFilterChainঅবজেক্ট।
init():
- এটি ফিল্টার ইনিশিয়ালাইজেশনের সময় একবার কল হয়। সাধারণত ফিল্টারের কনফিগারেশন বা রিসোর্স ইনিশিয়ালাইজ করার জন্য ব্যবহৃত হয়।
Syntax:
void init(FilterConfig filterConfig) throws ServletException;destroy():
- ফিল্টারটি ডেস্ট্রয় হওয়ার সময় এই মেথডটি কল হয়। এটি সাধারণত ক্লিন-আপ কার্যক্রম করার জন্য ব্যবহৃত হয়, যেমন রিসোর্স ফ্রি করা।
Syntax:
void destroy();
Filter API কনফিগারেশন
ফিল্টার কনফিগারেশন করতে দুটি প্রধান উপায় রয়েছে:
- web.xml (Deployment Descriptor): ওয়েব অ্যাপ্লিকেশনের web.xml ফাইলে ফিল্টার কনফিগার করা হয়।
- Annotation-based Configuration: স্প্রিং বা Servlet 3.0 এ অ্যানোটেশন ব্যবহার করে ফিল্টার কনফিগার করা যায়।
1. Filter কনফিগারেশন: web.xml এর মাধ্যমে
web.xml ফাইলে ফিল্টার কনফিগারেশন করার জন্য, আপনাকে ফিল্টার ক্লাসের নাম, URL প্যাটার্ন এবং যে ফিল্টার চেইনটি ব্যবহার করতে হবে তা কনফিগার করতে হবে।
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- Filter definition -->
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<!-- Filter mapping -->
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<url-pattern>/hello/*</url-pattern>
</filter-mapping>
</web-app>
এখানে, LoggingFilter নামক একটি ফিল্টার কনফিগার করা হয়েছে এবং এটি /hello/* পাথের রিকোয়েস্টে প্রয়োগ হবে।
2. Filter কনফিগারেশন: Annotation-based Configuration
@WebFilter অ্যানোটেশন ব্যবহার করে ফিল্টার কনফিগার করা যায়। এটি Servlet 3.0 থেকে শুরু হয়েছে এবং সহজেই ফিল্টার ব্যবস্থাপনা করা যায়।
Filter Class Example:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/hello/*") // Apply filter to all requests matching /hello/* path
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Filter initialization
System.out.println("Logging Filter Initialized");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// Log request information
System.out.println("Request received at: " + System.currentTimeMillis());
// Continue with the next filter or the servlet
chain.doFilter(request, response);
// Log response information after the request is processed
System.out.println("Response sent at: " + System.currentTimeMillis());
}
@Override
public void destroy() {
// Cleanup resources
System.out.println("Logging Filter Destroyed");
}
}
এখানে, @WebFilter("/hello/*") অ্যানোটেশন ব্যবহার করে ফিল্টারটি /hello/* পাথের সব রিকোয়েস্টে প্রযোজ্য হয়েছে।
Filter Example: Authentication Filter
এখানে একটি সাধারণ Authentication Filter উদাহরণ দেওয়া হলো, যা রিকোয়েস্টের আগে অথেনটিকেশন যাচাই করে।
AuthenticationFilter Example:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/protected/*")
public class AuthenticationFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Initialization logic if needed
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// Check if the user is authenticated
String authToken = httpRequest.getHeader("Authorization");
if (authToken == null || !isValid(authToken)) {
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized access");
return;
}
// If authenticated, proceed with the request
chain.doFilter(request, response);
}
private boolean isValid(String authToken) {
// Dummy check for token validity
return "valid-token".equals(authToken);
}
@Override
public void destroy() {
// Cleanup resources
}
}
এখানে, AuthenticationFilter ক্লাসটি */protected/ পাথের রিকোয়েস্টের জন্য প্রযোজ্য। এটি একটি সাধারন অথেনটিকেশন চেক করে এবং যদি ইউজার অথেনটিকেটেড না থাকে, তবে 401 Unauthorized রেসপন্স পাঠায়।
Conclusion
Servlet Filter API হল সার্ভলেট কন্টেইনারে রিকোয়েস্ট এবং রেসপন্স প্রোসেসিংয়ের মধ্যে একটি মধ্যবর্তী স্তরের প্রক্রিয়া। ফিল্টারগুলি সাধারণত লগিং, অথেনটিকেশন, পারফরম্যান্স ট্র্যাকিং এবং রিকোয়েস্ট বা রেসপন্স মডিফিকেশন করার জন্য ব্যবহৃত হয়। web.xml অথবা @WebFilter অ্যানোটেশন ব্যবহার করে ফিল্টার কনফিগার করা যায়। ফিল্টার কনফিগারেশন সঠিকভাবে করলে ওয়েব অ্যাপ্লিকেশনের নিরাপত্তা, পারফরম্যান্স এবং কার্যকারিতা বৃদ্ধি পায়।
Read more