Filter过滤器统计ip访问次数
简介
需要服务JSP页面,这里需要用到JSP中的EL表达式,所以首先要导jstl的jar包:
下载:https://tomcat.apache.org/download-taglibs.cgi
下载前两个就行:
然后就是导入jar包,不会的参考:
导入完成后进行代码的编写。
需要创建的类和文件:
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 map = (Map) 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 map = new LinkedHashMap();
// 得到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>ipth>
<th>countth>
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>day041302display-name>
<filter>
<filter-name>AFilterfilter-name>
<filter-class>demoFilter.AFilterfilter-class>
filter>
<filter-mapping>
<filter-name>AFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
启动Tomcat:
从浏览器访问jsp文件:
查看控制台输出结果:
代码没有异常。