• 过滤器和监听器



    学习视频来自于:秦疆(遇见狂神说)Bilibili地址
    他的自学网站:kuangstudy

    我们缺乏的不是知识,而是学而不厌的态度


    一、过滤器(Filter)

    介绍

    java过滤器能够对目标资源的请求和响应进行截取。过滤器的工作方式分为四种。request过滤器、forward过滤器、include过滤器、error过滤器。
    在这里插入图片描述

    使用

    1. 实现接口:javax.servlet.Filter
    2. 实现方法
    3. 配置web.xml

    案例

    解决中文乱码问题

    public class CharacterEncodingFilter implements javax.servlet.Filter {
    	// 初始化:web服务器启动,就已经初始化了,对视等待过滤对象。
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("过滤器准备好了");
        }
       //Chain : 链
       /*
       1. 过滤中的所有代码,在过滤特定请求的时候都会执行
       2. 必须要让过滤器继续同行
           chain.doFilter(request,response);
        */
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("进入过滤器");
            request.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            chain.doFilter(request, response);//让我们的请求继续走,如果不写,程序到这里就被拦截停止!
            System.out.println("通过过滤器");
        }
    
    	// 销毁:web服务器关闭的时候,过滤器会销毁
        @Override
        public void destroy() {
            System.out.println("过滤器关闭");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    配置web.xml

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>pers.tianyu.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/f1/*</url-pattern>
    </filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    二、监听器(Listener)

    介绍

    java中的监听器是指:监听并负责处理事件的方法,也叫事件监听器。Java中的监听涉及三个部分:1、事件;2、事件监听器;3、事件源。用户对组件的一个操作称之为一个事件。

    使用

    1. 实现接口:javax.servlet.http.HttpSessionListener
    2. 实现方法
    3. 配置web.xml

    案例

    统计网站在线人数

    public class ListenerDamo implements HttpSessionListener {
        //创建session监听: 看你的一举一动
        //一旦创建Session就会触发一次这个事件!
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            ServletContext context = se.getSession().getServletContext();
            // 打印sessionID
            System.out.println(se.getSession().getId());
            // 获取context中储存的在线人数
            Integer onlineCount = (Integer) context.getAttribute("OnlineCount");
            if (onlineCount == null) {
                onlineCount = 1;
            }else{
               onlineCount = onlineCount+1;
            }
            context.setAttribute("OnlineCount",onlineCount);
        }
    
        //销毁session监听
        //一旦销毁Session就会触发一次这个事件!
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            ServletContext context = se.getSession().getServletContext();
            // 打印sessionID
            System.out.println(se.getSession().getId());
            // 获取context中储存的在线人数
            Integer onlineCount = (Integer) context.getAttribute("OnlineCount");
            if (onlineCount == null) {
                onlineCount = 0;
            }else{
                onlineCount = onlineCount-1;
            }
            context.setAttribute("OnlineCount",onlineCount);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    xml

    <!--注册监听器-->
    <listener>
        <listener-class>pers.tianyu.listener.ListenerDamo</listener-class>
    </listener>
    
    • 1
    • 2
    • 3
    • 4

    三、过滤器、监听器常见应用

    3.1 监听器:GUI编程中经常使用

    public class TestPanel {
        public static void main(String[] args) {
            Frame frame = new Frame("中秋节快乐");  //新建一个窗体
            Panel panel = new Panel(null); //面板
            frame.setLayout(null); //设置窗体的布局
            frame.setBounds(300,300,500,500);
            frame.setBackground(new Color(0,0,255)); //设置背景颜色
            panel.setBounds(50,50,300,300);
            panel.setBackground(new Color(0,255,0)); //设置背景颜色
            frame.add(panel);
            frame.setVisible(true);
            //监听事件,监听关闭事件
            frame.addWindowListener(new WindowListener() {
                @Override
                public void windowOpened(WindowEvent e) {   
                }
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
                @Override
                public void windowClosed(WindowEvent e) {
                }
                @Override
                public void windowIconified(WindowEvent e) {
                }
                @Override
                public void windowDeiconified(WindowEvent e) {
                }
                @Override
                public void windowActivated(WindowEvent e) {
                }
                @Override
                public void windowDeactivated(WindowEvent e) {
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3.2 过滤器:权限拦截

    思路

    1. 用户登录
    2. 向session中存入权限等级
    3. 跳转主页前通过过滤器判断权限等级

    3.2.1 代码实现

    过滤器

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse resp = (HttpServletResponse) response;
    
            String level = (String)req.getSession().getAttribute("level");
            System.out.println("过滤器:"+level);
            if(level == null){
                resp.sendRedirect(req.getContextPath()+"/loginerreo.jsp");
            }
            chain.doFilter(req,resp);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    登录jsp

    <form action="${pageContext.request.contextPath}/Login2" method="post">
        <table>
            <tr>
                <td>用户</td>
                <td><input type="text" name="username" ></td>
            </tr>
            <tr><td><input type="submit" value="登录"></td></tr>
        </table>
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    登录servlet

    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    // 获取数据
    String username = (String)req.getParameter("username");
    // 后台查询
    HttpSession session = req.getSession();
    if(username.equals("admin")){
        session.setAttribute("level","vip1");
        resp.sendRedirect(req.getContextPath()+"/level/WeCome.jsp");
    }else {
        session.removeAttribute("level");
        resp.sendRedirect(req.getContextPath()+"/loginerreo.jsp");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注销

    HttpSession session = req.getSession();
    if (session != null) {
        session.removeAttribute("level");
        resp.sendRedirect(req.getContextPath() + "/Login.jsp");
    }else{
        resp.sendRedirect(req.getContextPath() + "/Login.jsp");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    性能调优必备神器 — Jprofiler解析
    主成分分析的基本原理
    基于Python实现的GN算法
    LeetCode 283. 移动零
    tqdm学习
    webpack项目篇(六十六):react 全家桶 和 webpack 开发 h5 商城项目的整体思路
    掌握未来技术趋势,Python编程引领人工智能时代
    【CSDN 每日一练 ★☆☆】【数论】用数组写水仙花数
    想要精通分布式微服务架构?你得先学会设计、原理与实战
    Java27岁啦——一次争执引起的Java内卷生涯
  • 原文地址:https://blog.csdn.net/zhao854116434/article/details/125484349