English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
المرشحات في JSP و Servlet هي كلاسات Java.
يمكن للمرشحات إعتراض الطلبات والإستجابات بشكل ديناميكي لتغيير أو استخدام المعلومات المضمنة في الطلبات أو الإستجابات.
يمكن إضافة مرشح واحد أو أكثر إلى Servlet أو مجموعة Servlet. يمكن أيضًا إضافة المرشح إلى ملفات JavaServer Pages (JSP) وصفحات HTML.
المرشحات هي كلاسات Java قابلة للإستخدام في برمجة Servlet، ويمكنها تحقيق ما يلي:
إعتراض هذه الطلبات قبل وصولها إلى الموارد الخلفية.
معالجة هذه الاستجابات قبل إرسالها إلى العميل.
أنواع المرشحات الموصى بها بناءً على المعايير المختلفة:
مرشحات التحقق من الهوية (Authentication Filters).
مرشحات ضغط البيانات (Data compression Filters).
مرشحات التشفير (Encryption Filters).
مرشحات إطلاق أحداث الوصول إلى الموارد.
مرشحات تحويل الصور (Image Conversion Filters).
مرشحات سجلات وتحقيق (Logging and Auditing Filters).
مرشحات سلسلة MIME-TYPE (MIME-TYPE Chain Filters).
مرشحات تكرار العلامات (Tokenizing Filters).
مرشحات XSL/T (XSL/T Filters)، تحويل محتوى XML.
يتم إعلان المرشحات من خلال علامات XML في وصف التكوين التوزيعي (web.xml) ثم تربط إلى اسم Servlet أو نمط URL في وصف التكوين التوزيعي للتطبيق.
عند بدء Web Container لبرنامج التطبيق Web، يقوم بإنشاء نموذج جديد لكل مرشح تم تسميته في وصف التكوين التوزيعي.
ترتيب تنفيذ Filter متطابق مع الترتيب المحدد في ملف التكوين web.xml، عادة ما يتم ضبط Filter قبل Servlet.
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端的请求与过滤器设置的 URL 匹配时,Servlet 容器将先调用过滤器的 doFilter 方法。FilterChain 用于访问后续过滤器。 |
2 | public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建 Filter 的示例对象,并调用其 init 方法,读取 web.xml 配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter 对象只会创建一次,init 方法也只会执行一次)。开发人员通过 init 方法的参数,可获得代表当前 filter 配置信息的 FilterConfig 对象。 |
3 | public void destroy() Servlet 容器在销毁过滤器示例前调用该方法,在该方法中释放 Servlet 过滤器占用的资源。 |
Filter 的 init 方法中提供了一个 FilterConfig 对象。
如 web.xml 文件配置如下:
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>الموقع</param-name> <param-value>موقع_التعليم_الأساسي</param-value> </init-param> </filter>
在 init 方法使用 FilterConfig 对象获取参数:
public void init(FilterConfig config) throws ServletException { // 获取初始化参数 String site = config.getInitParameter("Site"); // 输出初始化参数 System.out.println("网站名称: " + site); }
以下是 Servlet 过滤器的示例,将输出网站名称和地址。本示例让您对 Servlet 过滤器有基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序:
// 导入必需的 java 库 import javax.servlet.*; import java.util.*; // 实现 Filter 类 public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException { // 获取初始化参数 String site = config.getInitParameter("Site"); // 输出初始化参数 System.out.println("网站名称: " + site); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // 输出站点名称 System.out.println("站点网址:http://ar.oldtoolbag.com"); // 把请求传回过滤链 chain.doFilter(request,response); } public void destroy( ){ /* 在 Filter 示例被 Web 容器从服务移除之前调用 */ } }
DisplayHeader.java 文件代码如下:
// 导入必需的 java 库 import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/DisplayHeader") // 扩لع المنعن ال HttpServlet public class DisplayHeader extends HttpServlet { // 处لع المعر ال GET المنعن public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设لعر السلن المعر المنعن response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "HTTP Header Request Example - Basic Tutorial Website Example"; String docType = "<!DOCTYPE html> \n" out.println(docType + "<html>\n"+ "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+ "<body bgcolor=\"#f0f0f0\">\n"+ "<h1 align=\"center\">" + title + "</h1>\n"+ "<table width=\"100%\" border=\"1\" align=\"center\">\n"+ "<tr bgcolor=\"#949494\">\n"+ "<th>اسم الرأس</th><th>قيمة الرأس</th>\n"+ "</tr>\n"); Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String paramName = (String)headerNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\n"); String paramValue = request.getHeader(paramName); out.println("<td> " + paramValue + " </td></tr>\n"); } out.println("</table>\n</body></html>"); } // معالجة طلبات طريقة POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
تعريف المرشح، ثم قم بتحديد URL أو Servlet، وهو مشابه لتحديد Servlet ثم تحديد نمط URL. web.xml أنشئ المدخل التالي تحت علامة filter في
<?xml version="1.0" encoding="UTF-8"?> <web-app> <filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>الموقع</param-name> <param-value>موقع_التعليم_الأساسي</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <!-- الاسم --) <servlet-name>DisplayHeader</servlet-name> <!-- الملف الموجود في --) <servlet-class>com.w3codebox.test.DisplayHeader</servlet-class> </servlet> <servlet-mapping> <servlet-name>DisplayHeader</servlet-name> <!-- عنوان الموقع --) <url-pattern>/TomcatTest/DisplayHeader</url-pattern> </servlet-mapping> </web-app>
تطبيق المرشحات المذكورة أعلاه على جميع Servlets، لأننا قد specified في تكويننا /* . إذا كنت ترغب في تطبيق المرشحات فقط على عدد قليل من Servlets، يمكنك تحديد مسار Servlet معين.
الآن حاول إدخال أي Servlet باستخدام الطريقة الشائعة، وسترى السجلات التي يتم إنشاؤها في خادم الويب. يمكنك أيضًا استخدام مسجل Log4J لسجـل هذه السجلات في ملف منفرد.
الآن دعونا نزور هذا العنوان المثال http://localhost:8080/TomcatTest/DisplayHeader, ثم راجع محتوى الخروج في الشاشة الإدارية
يمكن للبرنامج التطبيقي على الويب تعريف عدة مرشحات مختلفة لأغراض محددة. افترض أنك قد قمت بتعريف مرشحين مُرشّح_التحقق و مُرشّح_السجلاتيجب عليك إنشاء خريطة مختلفة كما هو موضح أدناه، والمعالجة الباقية مشابهة لتلك التي تم شرحها سابقًا:}
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Parameter</param-value> </init-param> </filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>com.w3codebox.test.AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Parameter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
ترتيب عناصر filter-mapping في web.xml يحدد ترتيب تطبيق ميزة الفلتر على servlet. إذا كنت ترغب في عكس ترتيب الفلتر، فما عليك سوى عكس عناصر filter-mapping في ملف web.xml.
على سبيل المثال، سينطبق LogFilter أولاً، ثم AuthenFilter، ولكن في المثال التالي سيتم عكس هذا الترتيب:
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<filter> العنصر المستخدم لتعيين فلتر.
<filter-name> العنصر المستخدم لتعيين اسم للفلتر، يجب أن يكون محتوى هذا العنصر غير فارغ.
<filter-class> العنصر المستخدم لتعيين اسم الكائن الكامل المحدد للفلتر.
<init-param> العنصر المستخدم لتعيين المعلمات التحفيزية للفلتر، عناصر الابنة <param-name> تحدد اسم المعلمة، <param-value> تحدد قيمة المعلمة.
في الفلتر، يمكن استخدام كائن واجهة FilterConfig لاستدعاء المعلمات التحفيزية.
<filter-mapping> العنصر المستخدم لتعيين الموارد التي يتحكم فيها الفيلتر. يمكن تحديد الموارد التي يتحكم فيها الفيلتر بطرقين: اسم servlet و مسار طلب الوصول إلى الموارد
<filter-name> العنصر المستخدم لتعيين اسم التسجيل للفيلتر. يجب أن يكون هذا القيمة هو اسم الملفتر الذي تم إعلانه في عناصر <filter>.
<url-pattern> يحدد مسار الطلب الذي يتم تمريره إلى المتصفح (نمط URL المرتبط بالمتصفح)
<servlet-name> يحدد الاسم الذي يتم استدعاؤه للمتصفح الذي يتم تمريره إلى حاوي Servlet.
<dispatcher> يحدد كيفية استدعاء Servlet من قبل حاوي Servlet لمنع المصادر التي يتم تمريرها إلى المتصفح، يمكن أن تكون REQUEST, INCLUDE, FORWARD أو ERROR واحدة، الافتراضي REQUEST. يمكن للمستخدم تعيين عدة عناصر <dispatcher> لتعيين طرق استدعاء متعددة للمتصفح لمنع المصادر.
قيم الإعداد والمساويات التي يمكن تحديدها لـ <dispatcher>
REQUEST: عند زيارة المستخدم للصفحة مباشرة، سيقوم حاوي الويب بتشغيل المتصفح. إذا تم الوصول إلى المصدر الهدف من خلال طريقة include() أو forward() في RequestDispatcher، فإن المتصفح لن يتم استدعاؤه.
INCLUDE: إذا تم الوصول إلى المصدر الهدف من خلال طريقة include() في RequestDispatcher، فإن هذا المتصفح سيتم استدعاؤه. عدا ذلك، لن يتم استدعاء المتصفح.
FORWARD: إذا تم الوصول إلى المصدر الهدف من خلال طريقة forward() في RequestDispatcher، فإن هذا المتصفح سيتم استدعاؤه. عدا ذلك، لن يتم استدعاء المتصفح.
ERROR: إذا تم استدعاء المصدر الهدف من خلال ميكانيكية معالجة الاستثناءات التصريحية، فإن هذا المتصفح سيتم استدعاؤه. عدا ذلك، لن يتم استدعاء المتصفح.