JavaWeb三大组件之一:Filter过滤器

目录

1.Filter 什么是过滤器

2.Filter 的初体验

3.Filter 的生命周期

4.FilterConfig 类

5.FilterChain 过滤器链

6.Filter 的拦截路径

1.Filter 什么是过滤器

①Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是: Servlet 程序、 Listener 监听器、 Filter 过滤器
②Filter 过滤器它是 JavaEE 的规范。也就是接口
③Filter 过滤器它的作用是: 拦截请求 ,过滤响应。
拦截请求常见的应用场景有:
①权限检查
②日记操作
③事务管理
……等等

2.Filter 的初体验

  • 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必 须是用户登录之后才允许访问。
  • 思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否登录,可以判断 Session 中否包含有用户登录的信息即可!!!

 对于jsp文件的访问,可以用如下代码实现

    <%
        Object user = session.getAttribute("user");
        // 如果等于 null,说明还没有登录
        if (user == null) {
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return;
        }
    %>

但是仍可以访问图片、HTML等资源,该如何设置相关权限来访问它们呢?

Filter 的工作流程图:
JavaWeb三大组件之一:Filter过滤器_第1张图片

 Filter代码如下:

package com.atguigu.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author 白村客
 * @version //TODO
 * @date 2022-05-31 14:52
 * TODO
 */
public class AdminFilter implements Filter {
  ...

    /**
     * TODO doFilter方法,专门用于拦截请求,做过滤响应。
     * @param request  请求
     * @param response 响应
     * @param chain 过滤链
     * @throws IOException  io异常
     * @throws ServletException servlet异常
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //强制转换HttpServletRequest
        HttpServletRequest req = (HttpServletRequest)request;
        //获取session
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");
        // 如果等于 null,说明还没有登录
        if (user == null) {
            request.getRequestDispatcher("/login.jsp").forward(request,response);
            return;
        }else {
            // 让程序继续往下访问用户的目标资源
            chain.doFilter(request, response);
        }
    }

   ...
}

web.xml配置文件

    
    
        
        AdminFilter
        
        com.atguigu.filter.AdminFilter
    
    
    
        
        AdminFilter
        
        /admin/*
    
Filter 过滤器的使用步骤:
  • 步骤一,编写一个类去实现 Filter 接口
  • 步骤二,实现过滤方法 doFilter()
  • 步骤三,到 web.xml 中去配置 Filter 的拦截路径
完整的用户登录
login.jsp 页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    登录页面


这是登录页面。login.jsp 页面 
用户名:
密 码:

LoginServlet 程序

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 白村客
 * @version 1.0
 * @date 2022-05-31 15:21
 * TODO  登录应用程序
 */
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //避免响应乱码
        resp.setContentType("text/html; charset=UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("zhangsan".equals(username) && "123456".equals(password)) {
            req.getSession().setAttribute("user", username);
            resp.getWriter().write("登录 成功!!!");
        } else {
            req.getRequestDispatcher("/login.jsp").forward(req, resp);
        }
    }
}

浏览器会将图片等资源放入缓存中,以便快速访问。但在实际开发中,都需要清空缓存。两种清空缓存的方法:

①手动清除浏览器缓存。

②给缓存中变量名加一个唯一标识,常加时间戳,如购物车中“添加购物车”功能的跳转。 

3.Filter 的生命周期

Filter 的生命周期包含几个方法
  • ①构造器方法
  • ②init 初始化方法
        ①以及②,在 web 工程启动的时候执行(Filter 已经创建)
  • doFilter 过滤方法 (每次拦截到请求,就会执行)
  • destroy 销毁
        停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)

4.FilterConfig

        FilterConfig 类见名知义,它是 Filter 过滤器的配置文件类。
        Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。
        FilterConfig 类的作用是获取 filter 过滤器的配置内容
        1、获取 Filter 的名称 filter-name 的内容
        2、获取在 Filter 中配置的 init-param 初始化参数
        3、获取 ServletContext 对象

 java代码

    /**
     * TODO 初始化方法
     *
     * @param filterConfig filter配置信息
     * @throws ServletException servlet异常
     */
    @Override
    public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
        // 1、获取 Filter 的名称 filter-name 的内容
        System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
        // 2、获取在 web.xml 中配置的 init-param 初始化参数
        System.out.println("初始化参数 username 的值是:" + filterConfig.getInitParameter("username"));
        System.out.println("初始化参数 url 的值是:" + filterConfig.getInitParameter("url"));
        // 3、获取 ServletContext 对象
        System.out.println(filterConfig.getServletContext());
    }

 web.xml配置

 
    
        
        FilterConfig
        
        com.atguigu.filter.AdminFilterConfig
        
        
            username
            zhangsan
            url 
            jdbc:mysql://localhost3306/test
        
    

5.FilterChain 过滤器链

  • Filter         过滤器
  • Chain         链,链条
  • FilterChain 就是过滤器链(多个过滤器如何一起工作)

JavaWeb三大组件之一:Filter过滤器_第2张图片

 注意

  • doFilter()被去除后,将不会执行目标资源。
  • 当Filter1中的chain.doFilter()被去除后,其输出结果为“前置代码1-前置代码2”。
  • 当Filter2中的chain.doFilter()被去除后。其结果是“前置代码1-前置代码1-后置代码2-前后置代码”,但是目标资源将不会显示。

6.Filter 的拦截路径

-- 精确匹配
< url-pattern >/target.jsp url-pattern >
以上配置的路径,表示请求地址必须为: http://ip:port/ 工程路径 /target.jsp
-- 目录匹配
< url-pattern >/admin/* url-pattern >
以上配置的路径,表示请求地址必须为: http://ip:port/ 工程路径 /admin/*
-- 后缀名匹配
< url-pattern >*.html url-pattern >
以上配置的路径,表示请求地址必须以 .html 结尾才会拦截到
< url-pattern >*.do url-pattern >
以上配置的路径,表示请求地址必须以 .do 结尾才会拦截到
< url-pattern >*.action url-pattern >
以上配置的路径,表示请求地址必须以 .action 结尾才会拦截到

注意:Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!! 

摘自:尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版_哔哩哔哩_bilibili0基础如何学起?宋红康30天搞定Java核心:BV1Kb411W75N一键三连呀【点赞、投币、收藏】呀~本视频涵盖核心技术点有:Servlet程序、Filter过滤器、Listener监听器、jsp页面、EL表达式、JSTL标签库、jQuery框架、Cookie技术、Session会话、JSON使用、Ajax请求,并在讲解知识点过程中会带领大家完成一个书城项目。相对于旧版,本版本使用idea进行开https://www.bilibili.com/video/BV1Y7411K7zz?p=293 

你可能感兴趣的:(JavaWeb,java-ee,java)