ফিল্টার পরিচিতি
কিন্তু এখানেই শেষ নয়. আপনি সত্যিই মনে করেন না সার্লেটগুলি এত সহজ, তাই না?
আমরা ইতিমধ্যে বিশ্লেষণ করেছি এমন সার্লেটগুলি ছাড়াও তথাকথিত "ইউটিলিটি সার্লেট" - ফিল্টার রয়েছে । এগুলি সার্লেটগুলির সাথে খুব মিল, তবে তাদের প্রধান কাজ হল সার্লেটগুলিকে অনুরোধগুলি প্রক্রিয়া করতে সহায়তা করা।
একটি ফিল্টার একটি সচিবের মতো, এবং একটি সার্লেট একটি পরিচালকের মতো। নথিটি পরিচালকের ডেস্কে পৌঁছানোর আগে, এটি সচিবের হাত দিয়ে যাবে। এবং পরিচালক এটি স্বাক্ষর করার পরে, এটি আবার সচিবের কাছে যাবে, ইতিমধ্যে বহির্গামী চিঠিপত্র হিসাবে, উদাহরণস্বরূপ।
এই জাতীয় সচিব পরিচালকের কাছে কিছু অনুরোধ প্রত্যাখ্যান করতে পারেন (উদাহরণস্বরূপ, স্প্যাম)। অথবা তার পরিচিত প্রশ্নের মানক উত্তর দিন ("পরিচালক জায়গায় নেই")। ইত্যাদি। তদুপরি, এই জাতীয় একাধিক সচিব থাকতে পারে: একজন একসাথে সমস্ত পরিচালকের জন্য স্প্যাম ফিল্টার করতে পারে, অন্যজন বিভিন্ন পরিচালকের মধ্যে অনুরোধ স্থানান্তর করতে পারে এবং এর মতো।
ফিল্টার একই ভাবে কাজ করে।
ক্লাস ফিল্টার, ফিল্টারচেইন, ফিল্টার কনফিগ
ফিল্টারগুলি সার্লেটগুলির সাথে খুব মিল, তবে কয়েকটি ছোট পার্থক্য সহ। আপনার নিজস্ব ফিল্টার লিখতে, আপনাকে থেকে উত্তরাধিকারসূত্রে প্রাপ্ত করতে হবে javax.servlet.Filter
৷
ফিল্টারটিরও পদ্ধতি রয়েছে init()
এবং destroy()
. একটি পদ্ধতির পরিবর্তে, service()
একটি ফিল্টার একটি doFilter()
. এবং এমনকি তার নিজস্ব ক্লাস FilterConfig আছে। এছাড়াও web.xml ফাইলে বা @WebFilter টীকার মাধ্যমে ফিল্টারটি সার্লেটে যোগ করা হয়।
পদ্ধতির তালিকা:
পদ্ধতি | বর্ণনা | |
---|---|---|
1 | init(FilterConfig config) |
ফিল্টার আরম্ভ |
2 | destroy() |
ফিল্টার আনলোডিং |
3 | doFilter(ServletRequest , ServletResponse, FilterChain) |
অনুরোধ প্রক্রিয়াকরণ (ফিল্টারিং) |
একটি servlet এবং একটি ফিল্টার মধ্যে পার্থক্য কি?
বেশ কয়েকটি ফিল্টার থাকতে পারে এবং তারা ক্রমানুসারে অনুরোধ (এবং প্রতিক্রিয়া) প্রক্রিয়া করে। তারা একটি তথাকথিত শৃঙ্খলে মিলিত হয় - এবং এমনকি তাদের জন্য একটি বিশেষ শ্রেণীও রয়েছে FilterChain
।
পদ্ধতিতে অনুরোধটি প্রক্রিয়া করার পরে, আপনাকে চেইনের পরবর্তী ফিল্টারের doFilter()
পদ্ধতিটি কল করতে হবে । doFilter()
উদাহরণ:
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
PrintWriter out = resp.getWriter();
out.print("Adding something before the body of the response");
chain.doFilter(req, resp); // call the next filter in the chain
out.print("Adding something after the body of the response");
}
public void destroy() {
}
}
আসলে, আপনি এর মতো প্রতিক্রিয়া বডি যোগ করতে পারবেন না । আনুষ্ঠানিকভাবে, ফিল্টার এবং সার্লেট একে অপরের থেকে স্বাধীন এবং স্বাধীনভাবে পরিবর্তন করা যেতে পারে। এগুলি বিভিন্ন সময়ে বিভিন্ন বিকাশকারী দ্বারা লিখিত হতে পারে। ফিল্টার ফাংশন শুধুমাত্র একটি পরিষেবা ফাংশন, উদাহরণস্বরূপ:
- সমস্ত আগত অনুরোধ (এবং প্রতিক্রিয়া) লগ করা হচ্ছে
- তথ্য সংকোচন
- ডেটার এনক্রিপশন (এবং ডিক্রিপশন)
- তথ্য বৈধতা অনুরোধ
- পছন্দসই শিরোনাম যোগ/মুছে ফেলুন
- পুনঃনির্দেশ অনুরোধ
- অ্যাক্সেস নিয়ন্ত্রণ (ব্যবহারকারী লগ ইন করা আছে কিনা তা পরীক্ষা করা)
রিকোয়েস্ট ডিসপ্যাচার ক্লাস
একটি পদ্ধতির মধ্যে একটি ফিল্টার চলমান অবস্থায় কখনও কখনও doFilter()
অন্য সার্লেট কল করার প্রয়োজন হতে পারে । এটি করার জন্য, ধারকটিতে একটি বিশেষ বস্তু রয়েছে RequestDispatcher
।
আপনি এটি দুটি উপায়ে পেতে পারেন:
- বস্তুতে
HttpServletRequest
- বস্তুতে
ServletContext
এই বস্তুটি একটি বিদ্যমান অনুরোধকে অন্য সার্লেটে পুনঃনির্দেশ করতে ব্যবহার করা যেতে পারে । উদাহরণস্বরূপ, এটি প্রমাণিত হয়েছে যে ব্যবহারকারী অনুমোদিত নয় এবং আমরা তাকে অনুমোদন সহ একটি পৃষ্ঠা দেখাতে চাই। ভাল, অথবা সার্ভারে একটি ত্রুটি ছিল এবং আমরা ব্যবহারকারীর কাছে একটি ত্রুটি পৃষ্ঠা প্রদর্শন করতে চাই :)
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
String path = "/error.html";
ServletContext servletContext = this.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
requestDispatcher.forward(request, response);
}
}
আপনি RequestDispatcher
ফিল্টার থেকেও কল করতে পারেন।
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
String path = "/error.html";
ServletContext servletContext = req.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
requestDispatcher.forward(req, resp);
}
public void destroy() {
}
}
নোট করুন যে অনুরোধটি পদ্ধতিতে পরিচালনা করা হবে এবং ব্যবহারের পরে forward()
কল করার দরকার নেই ।doFilter()
RequestDispatcher
রিডাইরেক্ট এবং ফরওয়ার্ডের তুলনা
এবং আরও একটি গুরুত্বপূর্ণ পয়েন্ট। আপনি যদি ব্যবহারকারীকে আপনার সার্লেটের অন্য URI-তে পুনঃনির্দেশ করতে চান, তাহলে আপনি এটি দুটি উপায়ে করতে পারেন:
redirect
forward
আমরা ইতিমধ্যে সেগুলি বিশ্লেষণ করেছি, তবে সুবিধার জন্য আমি এটি আবার বলব।
যখন আপনি একটি কলের মাধ্যমে পুনঃনির্দেশ করেনresponse.sendRedirect("link")
, সার্ভার ব্রাউজারে (ক্লায়েন্ট) একটি প্রতিক্রিয়া 302
এবং আপনার নির্দিষ্ট করা লিঙ্কটি ফেরত পাঠায়। এবং ব্রাউজার, সার্ভারের প্রতিক্রিয়া বিশ্লেষণ করার পরে, আপনার পাস করা লিঙ্কটি ডাউনলোড করে। অর্থাৎ, ব্রাউজারে লিঙ্কটি একটি নতুনটিতে পরিবর্তিত হয়।
আপনি যদি একটি কলের মাধ্যমে ফরওয়ার্ড করেনrequestDispatcher.forward()
, তাহলে কন্টেইনারের ভিতরে একটি নতুন অনুরোধ করা হয় এবং আপনার সার্লেট আপনার সার্লেটের প্রতিক্রিয়া হিসাবে ব্রাউজারকে (ক্লায়েন্ট) এর প্রতিক্রিয়া পাঠায়। এই ক্ষেত্রে, ব্রাউজারটি নতুন সার্লেট থেকে একটি প্রতিক্রিয়া পায়, তবে ব্রাউজারে লিঙ্কটি পরিবর্তন হয় না।
GO TO FULL VERSION