在Servlet规范中,常用两种机制完成会话跟踪Cookie和Session.
WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就被称之为会话ID(SessionID).
在servlet规范中,常用一下机子红机制完成会话跟踪。
------COOKIE
------SESSION
COOKIE机制采用的实在客户端保持HTTP状态信息的方案。
COOKIE是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。
一旦web浏览器保存了某个COOKIE,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个COOKIE回传给WEB服务器。
底层的实现原理:WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将COOKIE信息发送给给浏览器,浏览器则通过在HTTP请求消息中增加COOKIE请求头字段将COOKIE回传给WEB服务器。
一个COOKIE只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE).
一个WEB站点可以给一个WEB浏览器发送多个COOKIE,一个WEB浏览器也可以存储多个WEB站点提供的COOKIE.
浏览器一般只允许存放300个COOKIE,每个站点最多存放20个COOKIE,每个COOKIE的大小限制为4KB.
Cookie实例:
<%@ 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 'cookie1.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>
This is my JSP page. <br>
<%Cookie cookie=new Cookie("name","sasa");
response.addCookie(cookie);
%>
</body>
</html>
浏览器打开开发者工具:第一次访问页面:
再次访问页面:
Servlet API中提供了javax.servlet.http.Cookie类来封装COOKIE信息,它包含生成COOKIE信息和提取COOKIE信息属性的各种方法。
HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加了一个Set-Cookie响应头字段。
HttpServletRequest接口中定义了一个getCookie方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。
测试:
<%@ 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 'cookie1.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>
This is my JSP page. <br>
<% Cookie cookie=new Cookie("name","sasa");
response.addCookie(cookie);
%>
<%Cookie[] cookies=request.getCookies();
if(cookies!=null && cookies.length>0){
for(Cookie c:cookies){
%>
<%=c.getName() %>
<%=
c.getValue() %>
<br>
<% } }
%>
</body>
</html>
浏览器查看结果:Cookie的发送
1.创建cookie对象
2.设置最大时效
3.将cookie放入到http响应抱头
--如果创建了一个cookie,并将它发送到浏览器,默认情况下它是一个会话级别的cookie;存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge。并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
--发送cookie需要使用response的addCookie方法,将cookie插入到一个set-cookie报头中。由于这个方法并不修改任何之前的set-cookie报头,而是创建新的报头,因此将这个方法称之为addCookie,而非setCookie。
会话cookie和持久化cookie的区别:
1).如果不设置过期时间,则表示这个cookie声明周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存中。
2).如果设置了过期时间,浏览器就会把cookie保存在硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。设置过期时间是使用setMaxAge()这个方法,以秒为单位,若参数为0,表示不删除该cookie,若参数为负数,表示不存储该cookie,若为整数,表示该cookie的存储时间。
3).存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
例如:
<%@ 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 'cookie1.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>
This is my JSP page. <br>
<% Cookie cookie1=new Cookie("name","sasa");
Cookie cookie2=new Cookie("age","18");
cookie1.setMaxAge(30);
response.addCookie(cookie1);
response.addCookie(cookie2);
%>
<%Cookie[] cookies=request.getCookies();
if(cookies!=null && cookies.length>0){
for(Cookie c:cookies){
%>
<%=c.getName() %>
<%=
c.getValue() %>
<br>
<% } }else{
out.print("没有cookie啊");
}
%>
</body>
</html>
第一次进入浏览器:
刷新浏览器:
关闭浏览器,再次进入: