侧边栏壁纸
  • 累计撰写 106 篇文章
  • 累计创建 19 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

十七、Filter 过滤器(JavaEE 零基础笔记)

zero
2020-04-11 / 0 评论 / 0 点赞 / 26 阅读 / 5008 字
温馨提示:
本文最后更新于 2024-07-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

17.1、什么是过滤器

1、Filter过滤器是JavaWeb的三大组件之一,Servlet程序、Listener监听器、Filter过滤器

2、Filter过滤器是JavaEE的规范,也是接口

3、Filter过滤器它的作用是 : 拦截请求、过滤响应

拦截请求常见的应用场景有:

1、权限检查

2、日志操作

3、事务管理

17.2、Filter的初体验

Filter过滤器的使用步骤

1、编写一个类去实现Filter接口

2、实现过滤方法的doFilter()

public class AdminFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object session = session.getAttribute("session");
        if (session == "bigbey"){
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest , servletResponse);
        } else {
            filterChain.doFilter(servletRequest , servletResponse);
        }
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

3、到web.xml中去配置Filter的拦截路径

    <listener>
        <listener-class>com.bigbey.HelloServlet</listener-class>
    </listener>

    <filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>com.bigbey.AdminFilter</filter-class>
    </filter>

17.3、Filter的登录之后的权限检查

1、点击登录后判断用户名与密码是否正确,正确则生成一个标识(cookie、session都行)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <form action="http://localhost:8080/login" method="get">
        用户名:<input type="text" name="username"/><br>
        密码:<input type="password" name="password"/><br>
        <input type="submit">
    </form>
</body>
</html>

2、访问资源时判断是否有标识,如果有则放行

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("flaming".equals(username) && "123456".equals(password)) {
            req.getSession().setAttribute("user", "bigbey");
            resp.getWriter().write("登录成功!!!");
        } else {
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }
}

17.4、Filter的生命周期

Filter的生命周期包含几个方法

1、构造器方法

2、init初始化方法

​ 第1、2步,在web工程启动的时候执行(Filter已经创建)

3、doFilter过滤方法

​ 第3步,每次拦截到请求,就会执行

4、destoy销毁

​ 第4步,停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)

17.5、FilterConfig类

FilterConfig类见名知义,它是Filter过滤器的配置文件

Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这个包含了Filter配置文件的配置信息

FilterConfig类的作用是获取Filter过滤器的配置文件

1、获取Filter的名称,filter-name的内容

2、获取在Filter中配置的init-param初始化参数

3、获取ServletContext对象

17.6、FilterChain 过滤器链

FilterChain.doFilter() 方法的作用

1、执行下一个Filter过滤器(如果有Filter)

2、执行目标资源(没有Filter)

在多个Filter过滤器执行的时候,它们执行的优先顺序是由它们在web.xml中从上到下配置的顺序决定的

多个Filter过滤器执行的特点 :

1、所有filter和目标资源默认都执行在同一个线程中

2、多个filter共同执行的时候,它们都使用同一个Request对象

17.7、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结尾才会拦截到-->

0

评论区