5月18日作业

在之前作业项目的基础上,编写过滤器和监听器:

  • 1过滤器:实现拦截访问主页的请求,只有用户登录成功了才能访问主页

  • 2监听器:统计所有用户登录的次数

过滤器:

package com.qiku.filter;


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

@WebFilter(filterName = "loginFilter", urlPatterns = "/index.jsp")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //只有登录成功之后,才能访问主页
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        //获取请求路径
        String servletPath = request.getServletPath();
        if (user == null && servletPath.contains("login")) {
            //用户没登录,且不是登录请求,则转发到登录页面
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("login.jsp");
            requestDispatcher.forward(servletRequest, servletResponse);
        }else {
            //表示登录成功并且是登录请求
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
}

监听器:

 package com.qiku.listener;



import com.qiku.entity.User;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;
import java.util.*;

@WebListener
public class UserLoginListener implements HttpSessionAttributeListener, ServletContextListener {
    /**
     * 统计所有用户的登录次数
     * 在ServletContext中,声明一个属性userMap,保存 Map<String , Integer>
     * 监听 session中属性名为 user 的变化
     */
    private ServletContext servletContext = null;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //初始化
        servletContext =sce.getServletContext();
        Map<String, Integer> userMap = new HashMap<>();
        servletContext.setAttribute("userMap",userMap);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //销毁
        servletContext = null;
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        System.out.println("新增了属性:"+se.getName());
        statisticalUserLogin(se);
    }
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        HttpSessionAttributeListener.super.attributeRemoved(se);
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        System.out.println("修改了属性:"+se.getName()+"="+se.getValue());
        statisticalUserLogin(se);
    }

    //封装统计用户登录的方法
    public void statisticalUserLogin(HttpSessionBindingEvent se){
        if (se.getName().equals("user")) {
            System.out.println("有新用户登录了...");
            //获取用户名
            HttpSession session = se.getSession();
            User user = (User) session.getAttribute("user");
            String username = user.getUsername();
            //从ServletContext中获取userMap
            Map<String, Integer> userMap = (Map) servletContext.getAttribute("userMap");
            //判断 userMap 中是否有key 包含 username
            //Integer是包装类  所以判断是否为null
            if (userMap.get(username) == null || userMap.get(username) == 0) {
                //该用户首次登录
                userMap.put(username, 1);
            } else {
                //不是首次登录
                userMap.put(username, userMap.get(username) + 1);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值