Cookie学习总结-显示上一次访问时间

本文介绍了一个简单的Servlet示例,通过使用Java Servlet中的Cookie来记录用户的最后访问时间,并在每次访问时更新这个时间。通过CookieDemoServlet和index.jsp页面展示如何读取和设置Cookie。

CookieDemoServlet.java

package blank.servlet;

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieDemoServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //定义cookie对象
        Cookie cookie = null;
        //请求request中
        Cookie cookies[] = request.getCookies();
        //遍历cookies信息
        if(cookies!=null){
            for(Cookie ck:cookies){
                 //获取每个cookie中的信息
                System.out.println(ck.getName()); //cookie的名称
                System.out.println(ck.getValue()); //对应的value值
                System.out.println(ck.getPath()); //有效目录
                System.out.println(ck.getMaxAge());//在浏览器上 cookie有效时间
                System.out.println(ck.getDomain());//有效的域

                String name = ck.getName();
                //判断cookie是否存在
                if("lasttimes".equals(name)){
                    cookie=ck;
                }
            }
        }

        //添加一个cookie
        if(cookie==null){
            //创建一个cookie对象 name value值
            cookie=new Cookie("lasttimes", System.currentTimeMillis()+"");
            System.out.println("====create==cookie=====");
        }
        request.setAttribute("lasttimes", new Date(Long.valueOf(cookie.getValue())));
        //重新改变值
        cookie.setValue(System.currentTimeMillis()+"");
        //添加到响应中
        response.addCookie(cookie);

        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }





    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!-- <link rel="stylesheet" type="text/css" href="styles.css"> -->

</head>

<body>
    <div>上次访问的时间:${lasttimes}</div>
    <div>
        <a href="./ck.do">第一次访问</a>
    </div>
</body>
</html>

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/u/2411130/blog/477352

<think>好的,我现在需要帮助用户了解如何使用Servlet和Cookie记录用户访问次数并动态更新计数器。首先,我得回忆一下Servlet和Cookie的基本知识。根据用户提供的引用内容,Servlet是运行在服务器端的Java程序,处理HTTP请求,而Cookie是服务器存储在客户端的一小段信息,用于跟踪用户状态。 用户的问题具体是如何记录访问次数,并在每次访问时更新计数器。我需要分步骤来设计解决方案。首先,当用户第一次访问时,服务器会创建一个新的Cookie,设置访问次数为1。如果用户再次访问,Servlet需要读取现有的Cookie,将次数加1,然后更新Cookie的值。 接下来要考虑的是Cookie的读写流程。处理HTTP请求时,Servlet可以通过HttpServletRequest对象的getCookies()方法获取客户端传来的所有Cookie。然后遍历这些Cookie,查找是否有名为“visitCount”的Cookie。如果存在,就取出其值,转换为整数,加1后更新;如果不存在,就新建一个Cookie,并将值设为1。 然后需要考虑的是Cookie的有效期。为了让Cookie在浏览器关闭后仍然保留一段时间,可能需要设置其最大存活时间(maxAge),比如设置为一年(60秒*60分*24小时*365天)。不过根据用户的需求,是否需要持久化到磁盘还是仅会话期间有效?用户可能希望即使关闭浏览器再打开,访问次数也能累计,所以设置较长的maxAge是合理的。 另外,每次更新Cookie后,必须通过HttpServletResponse的addCookie方法将修改后的Cookie发送回客户端,否则客户端不会保存变更。 还需要注意异常处理,比如Cookie的值可能被篡改或无法转换为整数,这时候应该如何处理。例如,捕获NumberFormatException,并重置计数器为1,或者忽略异常情况,保证程序的健壮性。 代码结构方面,用户提供的引用中有示例的Servlet结构,可以参考。比如,在doGet方法中处理请求,获取Cookie数组,遍历查找目标Cookie,然后进行相应的处理。最后将结果写入响应,比如显示访问次数和上次访问时间。 用户可能还希望显示上次访问时间,这可以通过另一个Cookie来记录。每次访问时,除了更新访问次数,还要将当前时间保存到另一个Cookie中,比如“lastVisit”。 现在,把这些思路整理成具体的步骤: 1. 在Servlet的doGet方法中,获取请求中的所有Cookie。 2. 遍历Cookie数组,查找“visitCount”和“lastVisit”。 3. 如果找到“visitCount”,解析其值为整数,加1;否则设为1。 4. 更新或创建“visitCount”Cookie,设置maxAge。 5. 同样处理“lastVisit”Cookie,记录当前时间。 6. 将更新后的Cookie添加到响应中。 7. 生成响应页面,显示访问次数和上次访问时间。 在代码实现时,需要注意Cookie的路径设置,可能需要设置为根路径(/)以便在整个应用内有效。此外,处理时间时,要格式化为合适的字符串,比如使用SimpleDateFormat。 现在,检查是否有遗漏的部分。例如,如何处理首次访问没有Cookie的情况,是否正确地初始化计数器。另外,中文字符编码的问题,可能需要设置响应的contentType为UTF-8,避免乱码。 最后,将整个流程用代码示例展示出来,并解释关键步骤。确保代码中的注释清晰,并符合用户提供的引用中的示例结构,比如使用@WebServlet注解,继承HttpServlet类等。 可能还需要考虑并发情况,但Servlet本身是线程安全的吗?实际上,每个请求在单独的线程中处理,但实例变量可能引发线程安全问题。不过在这个例子中,所有数据都存储在Cookie中,属于客户端状态,因此不会存在服务端的并发问题。 总结步骤,编写代码示例,并解释每个部分的作用。同时,提醒用户注意Cookie的安全性问题,比如HttpOnly和Secure标志,但用户的问题中没有提到这些,可能在回答中不需要深入讨论,除非用户特别要求。 最后,生成相关问题,帮助用户进一步学习,比如如何处理Cookie的过期时间,或者使用Session替代Cookie的优缺点等。</think>### 分步实现Servlet记录用户访问次数 #### 1. 创建Servlet类并重写doGet方法 ```java @WebServlet("/VisitCounter") public class VisitCounterServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); // 获取所有Cookie Cookie[] cookies = request.getCookies(); int visitCount = 1; String lastVisitTime = "首次访问"; // 遍历查找现有Cookie if (cookies != null) { for (Cookie cookie : cookies) { if ("visitCount".equals(cookie.getName())) { try { visitCount = Integer.parseInt(cookie.getValue()) + 1; } catch (NumberFormatException e) { visitCount = 1; // 无效值时重置计数器 } } if ("lastVisit".equals(cookie.getName())) { lastVisitTime = cookie.getValue(); } } } // 更新或创建Cookie Cookie countCookie = new Cookie("visitCount", String.valueOf(visitCount)); Cookie timeCookie = new Cookie("lastVisit", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // 设置Cookie有效期(1年) countCookie.setMaxAge(60*60*24*365); timeCookie.setMaxAge(60*60*24*365); // 设置路径为根目录 countCookie.setPath("/"); timeCookie.setPath("/"); // 添加Cookie到响应头 response.addCookie(countCookie); response.addCookie(timeCookie); // 生成响应页面 out.println("<h3>访问统计</h3>"); out.println("<p>访问次数: " + visitCount + "</p>"); out.println("<p>上次访问时间: " + lastVisitTime + "</p>"); } } ``` #### 2. 关键步骤说明 1. **Cookie获取**:通过`request.getCookies()`获取客户端发送的所有Cookie 2. **Cookie解析**: - 遍历Cookie数组查找`visitCount`和`lastVisit` - 遇到数值转换异常时重置计数器,保证健壮性 3. **Cookie更新**: - 创建新Cookie对象时自动覆盖同名Cookie - 设置`setMaxAge(31536000)`使Cookie保留1年 - `setPath("/")`确保整个网站可读取Cookie 4. **时间处理**:使用`SimpleDateFormat`格式化当前时间 5. **响应输出**:通过HTML展示统计信息 #### 3. 访问验证 1. 首次访问显示: ``` 访问次数: 1 上次访问时间: 首次访问 ``` 2. 第二次访问显示: ``` 访问次数: 2 上次访问时间: 2023-08-10 14:30:45 ``` #### 4. 注意事项 1. **Cookie大小限制**:单个Cookie建议不超过4KB 2. **隐私设置**:浏览器可能禁用Cookie,需做降级处理 3. **时间同步**:依赖客户端系统时间准确性 4. **安全增强**:可添加`cookie.setHttpOnly(true)`防止XSS攻击[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值