7.1 Filter过滤器 + Listener监听器

filter

大概的意思就是可以对一些进行拦截,比如你没有登录就不能进入一些网页。
在web下面新建一个filter文件夹装有关过滤器的文件
在这里插入图片描述

package web.fliter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        /**
        * 要从session中获取user对象进行一个是否登录的判断,session是HttpServletRequest 对象,request是ServletRequest需要进行一个强转
        * */
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        //判断访问资源路径是否和登录注册相关
        //1,在数组中存储登陆和注册相关的资源路径
        String[] urls = {"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
        //2,获取当前访问的资源路径
        String url = request.getRequestURL().toString();
        //3,遍历数组,获取到每一个需要放行的资源路径
        for (String u : urls) {
            //4,判断当前访问的资源路径字符串是否包含要放行的的资源路径字符串
            /*
                比如当前访问的资源路径是  /brand-demo/login.jsp
                而字符串 /brand-demo/login.jsp 包含了  字符串 /login.jsp ,所以这个字符串就需要放行
            */
            if(url.contains(u)){
                //找到了,放行
                filterChain.doFilter(servletRequest,servletResponse);
                //跳出这个for循环
                return;
            }
        }
        //1、判断session中是否有user
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        //2. 判断user是否为null
        if(user != null){
            // 登录过了
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            // 没有登陆,存储提示信息,跳转到登录页面
            request.setAttribute("login_msg","您尚未登陆!");
            request.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }
}

fliter的执行逻辑是
在这里插入图片描述
然后如果有多个过滤器,过滤器链
在这里插入图片描述
多个过滤器系统怎么知道谁是前面那个,即怎么给他们排顺序。
我们现在使用的是注解配置Filter,而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序。
比如有如下两个名称的过滤器 : BFilterDemo 和 AFilterDemo 。那一定是 AFilterDemo 过滤器先执行。

拦截路径有如下四种配置方式:

  • 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
  • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
  • 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
  • 拦截所有:/*:访问所有资源,都会被拦截

listener

  • Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
  • 监听器可以监听就是在 application,session,request 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。 request 和 session 我们学习过。而
    application 是 ServletContext 类型的对象。 ServletContext
    代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。

请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值