过滤器和监听器及应用

发布时间:2023年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里面的东西都是用过滤器去实现的。

三、Filter实现权限拦截

用户登录之后才能进入主页,用户注销后就不能进入主页了。
要实现这个,就要用到权限拦截。

  1. 用户登录之后,向session中存放用户的数据!
  2. 进入主页的时候要判断用户是否已经登录:要在过滤器中实现。

1.LoginServlet:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取前端请求的参数
        String username = req.getParameter("username");
        if (username.equals("admin")){//登录成功
            req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());
            resp.sendRedirect("/sys/success.jsp");
        }else{
            resp.sendRedirect("/error.jsp");
        }
    }
  1. LogoutServlet:
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object USER_SESSION = req.getSession().getAttribute(Constant.USER_SESSION);
        if (USER_SESSION!=null){
            req.getSession().removeAttribute(Constant.USER_SESSION);
        }
        resp.sendRedirect("/Login.jsp");
    }

3.过滤器:
在servlet之前加一层过滤器,实现注销后不能进入主页的功能:

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
//ServletRequest  HttpServletRequest  两个不一样。前者是后者的上一级,但上一级无法得到session。
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse response=(HttpServletResponse)resp;
        if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
            response.sendRedirect("/error.jsp");
        }
        filterChain.doFilter(request, response);
    }

4.注册过滤器:

   <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.kuang.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <!--        过滤sys下面的所有的页面-->
        <url-pattern>/sys/*</url-pattern>
    </filter-mapping>

Constant 类:

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