一、创建LastAccessServlet

该类主要用于实现获取Cookie信息并将当前时间作为Cookie值发送给客户端。

public class LastAccessServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// 指定服务器输出内容的编码方式UTF-8,防止发生乱码
		response.setContentType("text/html;charset=utf-8");
		String lastAccessTime = null;
		// 获取所有的cookie,并将这些cookie存放在数组中
		Cookie[] cookies = request.getCookies();
		// 遍历cookies数组
		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("您是首次访问本站!!!");
		} else {
			response.getWriter().print("您上次的访问时间是: " + lastAccessTime);
		}
		// 创建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); //设置cookie最大存在时间
		// 发送 cookie
		response.addCookie(cookie);
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.doPost(req, resp);
	}
}

 二、运行并访问

http://localhost:8080/chapter05/LastAccessServlet

第一次访问时

 但服务器端报错了

java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value

cookie值中出现非法字符,这个字符是空格,cookie值就是时间字符串。

简单解决办法是把空格换成"-"。

String currentTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(new Date());

再次访问,就能在浏览器中获取到cookie

 再访问一次就能拿到上次访问时间

当关闭浏览器后再次访问,又是首次访问,原因是默认情况下,cookie对象的Max-Age=-1,即浏览器关闭,就删除cookie对象。可以通过设置cookie有效时间来解决。

cookie.setMaxAge(60*60); //设置cookie最大存在时间
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐