目录
项目搭建
1.点击 过滤测试:网页计算器![](https://img-blog.csdnimg.cn/ab42b928d40c45fa8780d5f774de4d6c.png)
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);
}
}
}
}