配置过滤器:
<!-- 定义自己的过滤器 -->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.lyq.CountTimes</filter-class>
<-- 初始化过滤器参数 -->
<init-param>
<param-name>auther</param-name>
<param-value>Coffee_Guy</param-value>
</init-param>
</filter>
<--过滤器映射 -->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<-- 默认拦截说有的页面 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
CountTimes类定义:
package com.lyq;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CountTimes implements Filter {
// 过滤器传来的初始化值
private String auther ;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request ;
HttpServletResponse resp = (HttpServletResponse)response ;
// Cookie实现计数
boolean flag = false ;
Cookie [] coks = req.getCookies();
Cookie item = null ;
if(coks == null)
{
flag =false ;
}
else
{
for(int k=0;k<coks.length ;k++)
{
if(coks[k].getName().equals("time"))
{
flag = true ;
item = coks[k];
break ;
}
}
}
if(!flag)
{
long time = 1;
Cookie count = new Cookie("time",time+"");
resp.addCookie(count); // 更新客户端的Cookie值
}else {
// 取出Cookie中的次数加上一 ,然后把cookie重新发给客户端更新
long time = Integer.valueOf(item.getValue()) + 1 ;
Cookie cook = new Cookie("time",time+"");
resp.addCookie(cook); // 更新客户端的Cookie值
}
resp.addCookie(new Cookie("auther",auther));
// 将请求与响应衔接起来。完成用户的一次访问
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//取得初始化值
auther = filterConfig.getInitParameter("auther");
}
}
index.jsp页面:
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>主页</title>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<%
Cookie cookies[] = request.getCookies();
long count = 4;
String auther = "xxoo";
if(cookies != null)
{
for(int k=0;k<cookies.length ;k++)
{
if(cookies[k].getName().equals("time"))
{
count = Integer.valueOf(cookies[k].getValue());
}
if(cookies[k].getName().equals("auther"))
{
auther = cookies[k].getValue();
}
}
}
%>
<body>
<div align="center">
<h1>作者:<%=auther %></h1>
<h1>《Cookie实现 》已被访问<%=count %>次!</h1>
</div>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>主页</title>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<%
Cookie cookies[] = request.getCookies();
long count = 4;
String auther = "xxoo";
if(cookies != null)
{
for(int k=0;k<cookies.length ;k++)
{
if(cookies[k].getName().equals("time"))
{
count = Integer.valueOf(cookies[k].getValue());
}
if(cookies[k].getName().equals("auther"))
{
auther = cookies[k].getValue();
}
}
}
%>
<body>
<div align="center">
<h1>作者:<%=auther %></h1>
<h1>《Cookie实现 》已被访问<%=count %>次!</h1>
</div>
</body>
</html>
问题:
还有点没有想明白的,就是第一次访问:显示是index.jsp页面的初始化值:xxoo 4 次 。。。
我过滤器里处理,已经将第一次访问处理了啊。。也就是第一次访问时 会在过滤器里创建好Cookie 传给index.jsp页面了,按理说就不应该出现 第一次访问:index.jsp 中Cookies为null ,显示 xxoo 4次 的现象啊???目前还是想不明白呢。。。
希望读者能帮忙解答下疑惑,共同学习学习。。