当web程序启动后,放入application 作用域中一个Map<String, Integer>集合, 这个Map集合key是访问者的IP(IP地址可以从request里去获取),如果是第一次访问,则把值设置成1, 如果是第二次访问服务器(xxx.do),把值设置成2. 写一个展示页面,可以显示这个Map集合的数据(EL表达式,forEarch进行循环展示),每三秒刷新一次
时间: 2024-03-19 12:43:37 浏览: 77
如何获取访问者的IP信息
好的,具体实现可以按照以下步骤进行:
1. 在web.xml中添加一个监听器,用于在web应用启动时创建一个Map集合并将其放入application作用域中,代码如下:
```xml
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
```
```java
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 创建Map集合并放入application作用域中
Map<String, Integer> ipMap = new ConcurrentHashMap<>();
servletContextEvent.getServletContext().setAttribute("ipMap", ipMap);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// 应用关闭时清理资源
}
}
```
2. 编写一个过滤器,用于统计访问次数并将结果存入Map集合中,代码如下:
```java
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 获取访问者的IP地址
HttpServletRequest request = (HttpServletRequest) servletRequest;
String ip = request.getRemoteAddr();
// 获取存储访问次数的Map集合
ServletContext application = request.getServletContext();
Map<String, Integer> ipMap = (Map<String, Integer>) application.getAttribute("ipMap");
// 统计访问次数
if (ipMap.containsKey(ip)) {
ipMap.put(ip, ipMap.get(ip) + 1);
} else {
ipMap.put(ip, 1);
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
// 清理资源
}
}
```
3. 编写一个展示页面,使用EL表达式和forEach循环来展示Map集合中的数据,并使用定时器每隔三秒刷新页面,代码如下:
```html
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>IP访问次数统计</title>
<script type="text/javascript">
function refresh() {
window.location.reload();
}
setInterval("refresh()", 3000);
</script>
</head>
<body>
<h1>IP访问次数统计</h1>
<table>
<thead>
<tr>
<th>IP地址</th>
<th>访问次数</th>
</tr>
</thead>
<tbody>
<c:forEach var="entry" items="${applicationScope.ipMap}">
<tr>
<td>${entry.key}</td>
<td>${entry.value}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
```
这样就完成了IP访问次数统计并在页面上展示的功能。
阅读全文