5.18作业----过滤器Filter、监听器Listener

目录

项目搭建

 1.点击 过滤测试:网页计算器​编辑

2.跳转到登录界面 

3.登录成功,再次点击  过滤测试:网页计算器

4.跳转到计算器界面 

5.统计登录次数 

 6.过滤器Filter

7.拦截路径main.jsp

8.监听器Listener

9.统计用户登录次数界面  onlineUser.jsp


项目搭建

 

 1.点击 过滤测试:网页计算器

2.跳转到登录界面 

 

3.登录成功,再次点击  过滤测试:网页计算器

 

4.跳转到计算器界面 

 

5.统计登录次数 

 

 6.过滤器Filter

package com.ak.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 = "/main.jsp")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //实现  对用户访问主页请求的过滤拦截  也就是只有用户登录成功后才能访问主页  否则一律拦截
        //在session中查询username判断是否登录
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        //获取请求路径
        String servletPath = request.getServletPath();
        System.out.println("servletPath拦截路径:" + servletPath);
        //如果没登录  则跳转到登录界面
        //用户是否为空  或者  路径是否包含login
        if (user == null && !servletPath.contains("login")) {
            request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
        } else {
            //表示登录 成功  或者登录 请求
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

7.拦截路径main.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }

    #father {
        border-radius: 10%;
        margin-top: 5%;
        margin-left: 30%;
        width: 330px;
        height: 400px;
        background-color: black;
        border: 1px black solid;
    }

    #top {
        margin-top: 60px;
        margin-left: 10px;
        width: 230px;
        height: 70px;
        border: 2px red solid;
        background-color: white;
        float: left;
    }

    #exp2 {
        text-align: right;
        font-size: 20px;
        color: grey;
        width: 230px;
        height: 35px;
        background-color: rgb(26, 227, 117);
        border: 0px;
    }

    #exp1 {
        text-align: right;
        font-size: 30px;
        width: 230px;
        height: 35px;
        background-color: rgb(26, 227, 117);
        border: 0px;
    }

    #ce {
        border-radius: 40%;
        float: left;
        margin-left: 12px;
        margin-top: 60px;
        width: 60px;
        height: 70px;
        background-color: pink;
        font-size: 1.5em;
        font-weight: bolder;
        text-align: center;
    }

    button {
        border-radius: 40%;
        margin: 10px;
        width: 60px;
        height: 30px;
        float: left;
        background-color: blue;
        font-size: 1.5em;
        font-weight: bolder;
    }

    #red {
        background-color: red;

    }
    a{
        color: red;
    }
    input{
        background-color: blue;
    }

</style>
<body>
    <a style="color: red" href="loginSuccessful.jsp">返回主页</a><br>
    <%--获取Session中的username--%>
    <h4>登录成功,欢迎: ${user.username}</h4><br>
    <form action="out" method="post">
        <input type="submit" value="退出登录">
    </form>
<div id="father">
    <div id="top">
        <div id="text">
            <p id="exp2"></p>
            <p id="exp1"></p>
        </div>
    </div>
    <div><button id="ce" value="ce" onclick="C(this)">C</button></div>
    <table>
        <tr>
            <td><button id="del" value="del" onclick="del(this)">del</button></td>
        </tr>
        <tr>
            <td><button id="7" value="7" onclick="input(this)">7</button></td>
            <td><button id="8" value="8" onclick="input(this)">8</button></td>
            <td><button id="9" value="9" onclick="input(this)">9</button></td>
            <td><button id="+" value="+" onclick="input(this)">+</button></td>
        </tr>
        <tr>
            <td><button id="4" value="4" onclick="input(this)">4</button></td>
            <td><button id="5" value="5" onclick="input(this)">5</button></td>
            <td><button id="6" value="6" onclick="input(this)">6</button></td>
            <td><button id="-" value="-" onclick="input(this)">-</button></td>
        </tr>
        <tr>
            <td><button id="1" value="1" onclick="input(this)">1</button></td>
            <td><button id="2" value="2" onclick="input(this)">2</button></td>
            <td><button id="3" value="3" onclick="input(this)">3</button></td>
            <td><button id="*" value="*" onclick="input(this)">*</button></td>
        </tr>
        <tr>
            <td><button id="0" value="0" onclick="input(this)">0</button></td>
            <td><button id="." value="." onclick="input(this)">.</button></td>
            <td><button id="red" value="=" onclick="cal(this)">=</button></td>
            <td><button id="/" value="/" onclick="input(this)">/</button></td>
        </tr>
        </table>
</div>



<script>
    function input(obj) {
        document.getElementById("exp1").innerHTML += obj.value;
    }
    function cal(obj) {
        document.getElementById("exp2").innerHTML = document.getElementById("exp1").innerHTML;
        var exp = document.getElementById("exp1").innerHTML;
        document.getElementById("exp1").innerHTML = eval(exp);
    }
    function C(obj) {
        document.getElementById("exp1").innerHTML="";
        document.getElementById("exp2").innerHTML="";
    }
    function del(obj) {
        var exp = document.getElementById("exp1").innerHTML;
        var newExp = exp.substring(0,exp.length-1);
        document.getElementById("exp1").innerHTML = newExp;
    }

</script>
</body>
</html>

8.监听器Listener

package com.ak.listener;


import com.ak.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 OnlineUser 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);
            }
        }
    }
}

9.统计用户登录次数界面  onlineUser.jsp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值