本人小白一枚,欢迎大家一起讨论学习,如有错误,还望大家指教。
简述:
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话,常用的会话技术有Cookie(客户端会话技术)与Session(服务器端会话技术),而会话又是什么呢?就是浏览器第一次给服务器资源发送请求时建立会话,直到有一方断开为止。我们知道HTTP协议传输数据时是无状态的,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次建立会话时需要建立新的连接。例如当我们在网站上进行购物时,将商品加入到购物车时,当再次购物时服务器无法判断此商品到底是我们的会话还是他人的会话,此时就要引入一种机制,Cookie的出现,弥补了HTTP协议无状态的不足。
功能:
- Cookie相当于给客户端每一个客户颁发一个通行证,当客户访问时必须携带自己的通行证,这样服务器就能判断客户的身份了。
- 可以在一次会话中共享数据。
用法:
-
new Cookie(String name, String value):
创建cookie对象并绑定数据。 -
response.addCookie(Cookie cookie):
发送cookie对象。 -
Cookie[] request.getCookies():
获取Cookie对象,并得到数据。 -
cookie.setMaxAge(int seconds):
用来设置Cookie在浏览器中保存的时间。- 正数:将Cookie数据写到硬盘的文件中,持久化进行存储,并指定cookie存活时间,当存活时间到后,cookie文件自动删除。
- 负数:默认值,当浏览器关闭后,cookie数据自动销毁。
- 零:不保存cookie信息。
-
cookie存储中文问题:在tomcat 8之前,cookie中不能直接存储中文数据,需要进行URL编码,但在tomcat 8之后可以支持中文,但特殊字符暂时不支持,建议还是使用URL编码进行存储。
String java.net.URLEncoder.encode(str, charsetName):
使用该方法进行编码。java.net.URLDecoder.decode(str, charsetName):
使用该方法进行解码。
-
cookie共享问题
- 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
- 默认情况下cookie不能共享。
cookie.setPath(String path):
设置cookie的获取范围,默认情况设置当前的虚拟目录。如果要共享,则可以将path设置为"/"。
- 不同的tomcat服务器间cookie共享问题?
- cookie.setDomain(String path):如果设置二级域名相同如https://tieba.baidu.com和http://news.baidu.com/,那么多个服务器之间的cookie可以共享,使用
cookie.setDomain(".baidu.com")
就可以共享了。
- cookie.setDomain(String path):如果设置二级域名相同如https://tieba.baidu.com和http://news.baidu.com/,那么多个服务器之间的cookie可以共享,使用
- cookie是一小段文本信息,所以对于单个cookie的大小是有限制的(4KB),针对每个浏览器不同限制也有不同,以及对于同一域名下的总cookie数量也有限制(20个)
- 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
案例:
需求:访问一个Servlet,如果是第一次访问,则提示“您好,欢迎你首次访问”,如果不是第一次访问,则提示:“欢迎回来,您上次时间为:xxxx年xx月xx日 xx时xx分xx秒”。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取cookie
Cookie[] cookies = request.getCookies();
// 设置响应编码
response.setContentType("text/html;charset=utf-8");
long l = System.currentTimeMillis();
Date date = new Date(l);
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
// 对时间进行URL编码,此时间字符串中含有空格特殊字符,如果不进行URL编码,将会发生异常
String encode = java.net.URLEncoder.encode(format.format(date), "utf-8");
Cookie cookie = new Cookie("lastTime", encode);
if (cookies.length <= 1) {
CookieUtils.printCookie(cookies);
response.addCookie(cookie);
response.getWriter().write("你好,欢迎您首次访问!");
} else {
response.addCookie(cookie);
for (Cookie item : cookies) {
if ("lastTime".equals(item.getName())) {
// 对时间进行URL解码
String decode = java.net.URLDecoder.decode(item.getValue(), "utf-8");
response.getWriter().write("欢迎回来,您上次访问的时间为:" + decode);
break;
}
}
}
}
打印结果:首次访问
第二次访问:
在这里我们使用了中文,但是含有空格,如果我们不进行URL编码,则会发生异常。