Filter 过滤器的介绍及使用 谁借莪1个温暖的怀抱¢ 2022-12-02 00:47 209阅读 0赞 # Filter过滤器 # **MySql的语法看这篇就够了,传送地址:[MySql必知必会][MySql] JSP的使用看这篇就够了,传送地址:[JSP必知必会][JSP]** ### 文章目录 ### * Filter过滤器 * * 一、Filter过滤器的介绍 * 二、Filter过滤器的使用 * 三、Filter过滤器的生命周期 * 四、FilterConfig类 * 五、FilterChain过滤器链 * 六、Filter的拦截路径 ## 一、Filter过滤器的介绍 ## 1. Filter过滤器是JavaWeb三大组件之一,其余组件是:Servlet程序、Listener监听器 2. Filter过滤器是JavaEE规范,也就是一个接口 3. Filter过滤器的作用是:拦截请求、过滤响应 ## 二、Filter过滤器的使用 ## 1. Filter过滤器的使用步骤: (1) 编写一个类实现Filter接口 (导入的包为:javax.servlet.Filter) (2) 实现三个方法: ①实现过滤方法doFilter(),此方法中的: filterChain.doFilter(servletRequest,servletResponse); 只有执行此方法,才可以访问拦截路径中的资源,若未执行此方法则代表拦截 ②实现init()方法 ③实现destroy()方法 (3) 到web.xml中配置Filter的拦截路径 1. Filter过滤器的工作流程: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTM0MzE5MA_size_16_color_FFFFFF_t_70_pic_center] 2. 案例:在web目录下有一个Admin目录,此目录下的所有资源都必须用户登录之后才可访问, 若没有登录,则跳转到登录页面 分析: 用户登录之后会把登录信息保存到Session域中,所以检查用户是否登录,可以判断Session 中是否包含用户的登录信息即可 代码演示(1):创建LoginServlet程序 public class LoginServlet implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpSession session = httpServletRequest.getSession(); Object user = session.getAttribute("user"); //如果等于null,说明还没有登录 if (user == null) { httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); } else { //登录成功,可以访问Admin目录下的目标资源 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } } 代码演示(2):在web.xml中编写配置 <!-- Filter标签用于配置一个Filter过滤器,用法与Servlet标签一致 --> <filter> <filter-name>LoginServlet</filter-name> <filter-class>com.qizegao.Filter.LoginServlet</filter-class> </filter> <filter-mapping> <filter-name>LoginServlet</filter-name> <!-- url标签用于配置拦截路径,也就是访问哪些资源需要被拦截 --> <!-- /表示工程路径,映射到web目录 --> <!-- /*代表指定目录下的所有文件 --> <url-pattern>/Admin/*</url-pattern> </filter-mapping> 运行结果: 直接在浏览器输入:http://localhost:8080/MyTest/Admin/a.jsp,跳转到login.jsp,无法访问a.jsp 注意: 1.Filter过滤器也支持注解,在首行加@WebFilter(“拦截路径”),则无需web.xml文件 2.浏览器不能直接访问实现Filter接口的类,只需访问拦截路径,就会自动的触发doFilter方法 ## 三、Filter过滤器的生命周期 ## 1.构造器方法 2.init初始化方法 3.doFilter方法 (其中有chain.doFilter方法) 4.destroy方法 其中:① 1和2在web工程启动的时候执行(即在创建Filter过滤器) ② 第三步,符合拦截路径的请求发送到服务器的时候,自动的执行,若请求不属于拦截 路径,则不会执行 ③ 第四步,停止web工程的时候执行(停止web工程,也会销毁Filter过滤器) ## 四、FilterConfig类 ## 1.FilterConfig类是Filter过滤器的配置文件类,每次创建Filter的时候,也会创建一个FilterConfig 类,其中包含了Filter配置文件的配置信息 2.FilterConfig类的作用是获取Filter过滤器的配置文件内容: (1) 获取Filter的名称,即web.xml文件中标签的值: filterConfig.getFilterName(); (2) 获取web.xml文件中标签的值(写在filter标签中,可写多个),如: ![在这里插入图片描述][20200828153846148.png_pic_center] (3) 获取ServletContext对象:filterConfig.getServletContext() ## 五、FilterChain过滤器链 ## 作用:解决多个过滤器如何一起工作 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTM0MzE5MA_size_16_color_FFFFFF_t_70_pic_center 1] 注意: 1. 上述两个Filter拦截的资源路径相同,代表一定会执行两个Filter过滤器的doFilter方法, 但因为手动注释不一定执行其中的chain.doFilter方法 2. 如果两个Filter拦截资源不同,且拦截资源符合Filter1,不符合Filter2,则会执行Filter1 的doFilter方法,且执行其中的chain.doFilter方法时,不会去执行Filter2的doFilter方法, 直接去访问资源,之后执行Filter1的后置代码(在chain.doFilter之后的均是后置代码) 3. 如果请求的资源不符合过滤器1和2的拦截路径,两个doFilter方法都不执行 4. 前置代码、chain.doFilter方法、后置代码都在doFilter方法中 ## 六、Filter的拦截路径 ## 1.精确匹配 <url-pattern>/target.jsp</url-pattern> 表示请求的地址必须为http://ip:port/工程路径/target.jsp,才可以触发doFilter方法 2.目录匹配 <url-pattern>/admin/*</url-pattern> 表示请求的地址必须为http://ip:port/工程路径/admin/目录下所有的文件,才可以触发doFilter方法 3.后缀名匹配 <url-pattern>*.html</url-pattern> 表示请求地址必须以.html结尾才可以触发doFilter方法 <url-pattern>*.jsp</url-pattern> 表示请求地址必须以.jsp结尾才可以触发doFilter方法 注意:Filter过滤器只关心请求的地址是否符合拦截路径,不会关心请求的资源是否存在 代码演示:FilterChain过滤器链的使用 (1) 在Admin目录下创建a.jsp ![在这里插入图片描述][20200828154126731.png_pic_center] (2) 创建两个Filter过滤器 public class Filter1 implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("Filter1的前置代码执行"); chain.doFilter(req, resp); System.out.println("Filter1的后置代码执行"); } } public class Filter2 implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("Filter2的前置代码执行"); chain.doFilter(req, resp); System.out.println("Filter2的后置代码执行"); } } (3) 在web.xml中编写配置 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTM0MzE5MA_size_16_color_FFFFFF_t_70_pic_center 2] 运行结果: 在浏览器地址栏输入:http://localhost:8080/MyTest/Admin/a.jsp 控制台输出: ![在这里插入图片描述][20200828154207519.png_pic_center] [MySql]: https://blog.csdn.net/weixin_49343190/article/details/107313699 [JSP]: https://blog.csdn.net/weixin_49343190/article/details/107932765 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTM0MzE5MA_size_16_color_FFFFFF_t_70_pic_center]: /images/20221123/d220b339ccae46e08d088d9e79d9c645.png [20200828153846148.png_pic_center]: /images/20221123/4ec3d75cd1be485eb9d79c4670bf804b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTM0MzE5MA_size_16_color_FFFFFF_t_70_pic_center 1]: /images/20221123/d2349aa520e54455a8ecce096b5254f2.png [20200828154126731.png_pic_center]: /images/20221123/0424738f3a3749f8938b3ffd597bf016.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTM0MzE5MA_size_16_color_FFFFFF_t_70_pic_center 2]: /images/20221123/00310dc209d647cfa7228b6e4f42a7e9.png [20200828154207519.png_pic_center]: /images/20221123/0c23d8dcbcf74ddfa77e014a60628053.png
还没有评论,来说两句吧...