javaweb学习总结 Cookie案例——显示用户上次访问时间

当访问某些web应用可显示用户上次访问时间,利用cookie实现.设置cookie的name为lastAccess,value的值为lastAccessTime。

package cn.edu.bdu.mc;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LastAccessServlet")
public class LastAccessServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        /*
         * 设定一个 cookie 的name : lastAccessTime 读取客户端发送cookie 获得用户上次的访问时间显示
         */
        String lastAccessTime = null;
        // 获取所有的cookie,并将这些cookie存放在数组中
        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if ("lastAccess".equals(cookies[i].getName())) {
                // 如果cookie的名称为lastAccess,则获取该cookie的值
                lastAccessTime = cookies[i].getValue();
                break;
            }
        }
        // 判断是否存在名称为lastAccess的cookie
        if(lastAccessTime!=null){
            response.getWriter().print("您上次的访问时间" + lastAccessTime);
        }else{
            response.getWriter().print("您是首次访问本站!!!");
        }
        // 创建cookie,将当前时间作为cookie的值发送给客户端
        String currenttime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
        Cookie cookie = new Cookie("lastAccess",currenttime);
        cookie.setMaxAge(60 * 60);// 保存1小时
        // 访问chapter006下资源时回送cookie
        cookie.setPath("/chapter006");
        // 发送 cookie
        response.addCookie(cookie);
    }
}

在tomcat8.3.5上抛出异常java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value。

这句话的意思是 一个不识别的字符[32]出现在了cookie当中 由于tomcat的版本比较高,所以在addCookie时是不能使用空格的 而在ASCII码中32对应的就是空格。只要把后台代码中的空格删掉就可以了。

通过借鉴https://blog.csdn.net/Rain_JN/article/details/75912083?locationNum=4&fps=1帖子  可在d和h之间显示出空格

可以在获取当前登录时间时,使用URLEncoder编码,再设置为cookie的值;在获取cookie的value值的时候,使用URLDecoder解码   在输出的时候使用utf-8输出中文

关于URLEncoder编码和URLDecoder解码可参照https://blog.csdn.net/justloveyou_/article/details/57156039这篇帖子

package cn.edu.bdu.mc;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

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

/**
 * Servlet implementation class LastAccessServlet02
 */
@WebServlet("/LastAccessServlet02")
public class LastAccessServlet02 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LastAccessServlet02() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String currenttime = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss").format(new Date());
        currenttime = URLEncoder.encode(currenttime, "UTF-8");
        Cookie cookie = new Cookie("lastAccess",currenttime);
        cookie.setMaxAge(60 * 60);// 保存1小时
        // 访问chapter006下资源时回送cookie
        cookie.setPath("/chapter006");
        // 发送 cookie
        response.addCookie(cookie);
        String lastAccessTime = null;
        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if ("lastAccess".equals(cookies[i].getName())) {
                // 如果cookie的名称为lastAccess,则获取该cookie的值
                lastAccessTime = URLDecoder.decode(cookies[i].getValue(),"utf-8");
                break;
            }
        }
        response.setContentType("text/html;charset=UTF-8");
        // 判断是否存在名称为lastAccess的cookie
        if(lastAccessTime!=null){
            response.getWriter().print("您上次的访问时间" + lastAccessTime);
        }else{
            response.getWriter().print("您是首次访问本站!!!");
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
 

你可能感兴趣的:(javaweb)