简介
需要服务JSP页面,这里需要用到JSP中的EL表达式,所以首先要导jstl的jar包:
下载:https://tomcat.apache.org/download-taglibs.cgi
下载前两个就行:
然后就是导入jar包,不会的参考:https://www.cnblogs.com/0099-ymsml/p/16062244.html
导入完成后进行代码的编写。
需要创建的类和文件:
AFilter:
package demoFilter;
import java.io.IOException;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 从application中获取servletContext
* 从request中获取IP
* 统计次数保存在Map中
* @author CDU_LM
*
*/
public class AFilter implements Filter {
private FilterConfig config;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
/**
* 得到app中的map
* 从request中获取当前客户端的IP地址
* 查看map中是否存在这个IP对应的访问次数
* 如果存在则次数加1并保存回去
* 如果不存在则设置访问次数为1
*/
// 从已经赋值的config中得到ServletContext对象app
ServletContext app = this.config.getServletContext();
// 取出ServletContext中保存的map集合
Map<String,Integer> map = (Map<String, Integer>) app.getAttribute("map");
// 获取客户端的IP地址
String ip = request.getRemoteAddr();
// 进行判断
if(map.containsKey(ip)) { // ip存在,访问次数加1再保存
Integer count = map.get(ip); // 通过ip查看对应ip的值
map.put(ip, count+1);
}else { // ip不存在,是第一次访问,则直接赋值为1
map.put(ip, 1);
}
// 最后将统计后的map保存到ServletContext对象app中
app.setAttribute("map",map);
System.out.println("AFilter......" + map.get(ip) + " ip:" + ip + " Host:" + request.getRemoteHost() + " Port:" + request.getRemotePort());
// 因为只是统计访问次数,不需要进行拦截,所以一定要放行
chain.doFilter(request, response); // 放行
}
// 从服务器启动就执行,最先执行
public void init(FilterConfig fConfig) throws ServletException {
this.config = fConfig; // 将方法中的fConfig取出到定义的全局变量中
}
}
AListener:
package demoListener;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class AListener implements ServletContextListener {
/**
* 在服务器启动时创建Map,保存到ServletContext中
*/
public void contextInitialized(ServletContextEvent sce) {
// 创建Map
Map<String,Integer> map = new LinkedHashMap<String,Integer>();
// 得到ServletContext
ServletContext app = sce.getServletContext();
// 把Map保存到ServletContext
app.setAttribute("map",map); // 设置一个属性,名称为map,值为map集合
System.out.println("Listener.....");
}
}
这里不需要AServlet,所以下一个创建AJSP.jsp:
AJSP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ip次数统计</title>
</head>
<body>
<h1 align="center">There is a method for count the ip !!!</h1>
map:${ applicationScope.map }
<br />
<br />
<br />
<br />
<table align="center" width="60%" border="2">
<tr>
<th>ip</th>
<th>count</th>
</tr>
<tr>
<c:forEach items="${applicationScope.map}" var="entry">
<td>${entry.key}</td>
<td>${entry.value}</td>
</c:forEach>
</tr>
</table>
</body>
</html>
然后是web.xml的配置:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<display-name>day041302</display-name>
<filter>
<filter-name>AFilter</filter-name>
<filter-class>demoFilter.AFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
启动Tomcat:
从浏览器访问jsp文件:
查看控制台输出结果:
代码没有异常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)