过滤器和监听器及应用

2023-12-16 12:12:20


Filter有什么用?

Filter:过滤器,可以用来过滤网站的数据。
比如
处理中文乱码
,每次写servlet,req和resp都需要重新设置编码,要是有一个机制能够在调用servlet之前就把中文乱码处理好。Filter就可以做到。
在这里插入图片描述

一、Filter处理中文乱码

  1. Filter导包不要导错:

在这里插入图片描述

  1. 过滤器Filter:
public class CharacterEncodingFilter implements Filter {
    //初始化,web服务器启动的时候,就已经初始化了,随时等待过滤对象出现
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

  
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html");

        System.out.println("CharacterEncodingFilter执行前....");
//        chain:链,起一个放行的作用,不写这个,代码到这里就停住了。
        chain.doFilter(req,resp);
        System.out.println("CharacterEncodingFilter执行后.....");
    }

    //销毁,web服务器关闭时,过滤器会销毁。
    @Override
    public void destroy() {
    //System.gc():通知垃圾回收站清理东西。
   		System.gc();
        System.out.println("CharacterEncodingFilter销毁");
    }
}

3.对应的Servlet:

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("你好,世界!");
    }

4.配置web.xml文件:

在这里插入图片描述
处理前:
在这里插入图片描述
处理后:
在这里插入图片描述

二、监听器,统计网站在线人数

1.监听器引入

浏览器是一个客户端软件,为什么点击错号就能关闭
在这里插入图片描述

2.统计网站在线人数

2.1建立监听器:


//统计网站在线人数,统计session
public class OnLineCountListener implements HttpSessionListener {
//    创建session监听:监视你的一举一动。
//    一旦创建session就会触发一次这个事件。不管是哪个session
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        ServletContext sc = httpSessionEvent.getSession().getServletContext();

        Integer onLineCount = (Integer) sc.getAttribute("OnLineCount");
        if (onLineCount == null){
            onLineCount=new Integer(1);
        }else {
            int value = onLineCount.intValue();
            onLineCount=new Integer(value+1);
        }
        sc.setAttribute("OnLineCount",onLineCount);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("已销毁1个");
        ServletContext sc = httpSessionEvent.getSession().getServletContext();
        Integer onLineCount = (Integer) sc.getAttribute("OnLineCount");
        if (onLineCount == null){
            onLineCount=new Integer(0);
        }else {
            int value = onLineCount.intValue();
            onLineCount=new Integer(value-1);
        }
       sc.setAttribute("OnLineCount",onLineCount);
    }
}

2.2 注册监听器:

   <!--    注册监听器  -->
    <listener>
        <listener-class>com.kuang.listener.OnLineCountListener</listener-class>
    </listener>

2.3获取网站在线人数:

<h1>当前有 <span> <%= this.getServletConfig().getServletContext().getAttribute("OnLineCount")%> </span> 人在线!</h1>

2.4session的销毁:

session.invalidate();//手动注销
    <session-config>
<!--  自动销毁: 1分钟后,session失效,以分钟为单位。-->
        <session-timeout>1</session-timeout>
    </session-config>

设置销毁之后,才会触发销毁的方法,减少网站的人数。

一个浏览器是一个session:
刚开始有3个人在线,网站默认开始就有3个session,重新发布项目Redeploy就没了。
在这里插入图片描述

后面SpringMVC,SpringBoot里面的东西都是用过滤器去实现的。

文章来源:https://blog.csdn.net/weixin_51646336/article/details/135024292
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。