cookie

     会话和会话状态:

     WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。

     WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。

--------------------------------------------------------------------------

     如何实现有状态的会话:

     WEB服务器端程序要能从大量的请求消息中区分出哪些请求消息属于同一个会话,即能识别出来自同一个浏览器的访问请求,这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。 在 Servlet 规范中,常用以下两种机制完成会话跟踪:Cookie ,Session 。

--------------------------------------------------------------------------

     cookie机制 :

    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。

---------------------------------------------------------------

在Servlet程序中使用Cookie :

      Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。

   Cookie类的方法:

    构造方法: public Cookie(String name,String value)

            getName方法

            setValue与getValue方法

            setMaxAge与getMaxAge方法

           setPath与getPath方法

          HttpServletResponse接口中定义了一个addCookie方法,它用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段。HttpServletRequest接口中定义了一个getCookies方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项。

--------------------------------------------------------------

cookie的发送 :

1.创建Cookie对象

2.设置最大时效

3.将Cookie放入到HTTP响应报头

如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie; 存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP响应报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此将这个方法称为是addCookie,而非setCookie。

--------------------------------------------------------------

会话cookie和持久cookie的区别 :

      如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

---------------------------------------------------------------------------

cookie的读取 :

1.调用request.getCookies要获取浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。

 

 2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止跟踪用户上次访问站点的时间

功能:帮助网站实现提示客户端计算机上次访问网站的时间

实现原理:将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以Cookie的形式存储到客户端的计算机中,客户端进行下次访问时通过该Cookie回传上次访问站点的时间值。为了让Cookie信息在客户端浏览器或计算机关闭后仍然保持存在,Cookie的保存时间被设置为了一年。

-------------------------------------------------------------

使用cookie属性的注意问题: 属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。 因此除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie;服务器端来自于浏览器的cookie并没有设置这些属性。

--------------------------------------------------------------

现在有个关于用户名密码登陆的cookie的小练习!

login.jsp :表单提交的页面!页面将提交到hello.jsp.

<%@ page language="java" import="java.util.*" session="false" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>
<head>
<title>
My JSP 'login.jsp' starting page
</title>
</head>
<body>
<form action="hello.jsp" method="post">
name: <input type="text" name="name" />
password: <input type="password" name="password" />
<input type="submit" value="Submit" />
</form>
</body>
</html>


hello.jsp:

<%@ page language="java" import="java.util.*" session="false" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>
<head>
<title>
My JSP 'hello.jsp' starting page
</title>
</head>
<body>
<%
//获取表单提交的 name 值
String name = request.getParameter ("name");
//1. name 值不为空, 说明是从 login.jsp 页面提交过来的, 此时需要直接输出: Hello: name; 并将name 做成一个 Cookie 回传给浏览器
if(name != null){
out.println(
"hello: " + name);
Cookie cookie
= new Cookie("name", name);
cookie.setMaxAge(
60);//将cookie进行持久化操作
response.addCookie(cookie);
}
//2. name 值为空, 说明是直接访问 hello.jsp 页面, 此时需要从 Cookie 中取得 name 信息, 若Cookie 中没有 name 信息, 说明 Cookie 已经过期或从未登陆
//过 login.jsp 页面, 需要返回给 login.jsp, 让其重新登陆。
else{
Cookie [] cookies
= request.getCookies();
String cookieValue = null;
for(int i = 0; cookies != null && i < cookies.length; i++){
Cookie cookie
= cookies[i];
if(cookie.getName().equals("name")){
cookieValue
= cookie.getValue();
}
}
if(cookieValue != null){
out.print(
"Hello: " + cookieValue);
}
else{
response.sendRedirect(
"login.jsp");
}
}
%>
</body>
</html>


 通过上面的例子,可以看出cookie的作用!

  cookie.setMaxAge(60);//将cookie进行持久化操作。

   有了这句话可以设置cookie的时间!第一次返回hello:xxx的时候,只要在规定时间内访问,都可以访问到用户名的!但是

   过了时间,用户名就会变成null!

下面有个查看图书的的小例子!

books.jsp:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
2
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>
4 <head>
5 <title>
6 My JSP 'books.jsp' starting page
7 </title>
8 </head>
9 <body>
10 <a href="bookDetails.jsp?book=Java">Java</a>
11 <br>
12 <a href="bookDetails.jsp?book=Oracle">Oracle</a>
13 <br>
14 <a href="bookDetails.jsp?book=Ruby">Ruby</a>
15 <br>
16 <a href="bookDetails.jsp?book=SOAP">SOAP</a>
17 <br>
18 <a href="bookDetails.jsp?book=Mysql">Mysql</a>
19 <br>
20 <a href="bookDetails.jsp?book=Iphone">Iphone</a>
21 <br>
22 <c:url value="bookDetails.jsp" var="yiyuyan" scope="page">
23 <c:param name="book" value="易言"></c:param>
24 </c:url>
25 <a href="${pageScope.yiyuyan }">易语言</a>
26 <br>
27 <%
28 //要求: 在 浏览器 端, 只保留最后浏览过的 3 本图书信息
29 //显示:您曾经浏览过一下图书: x, y, z
30 ArrayList books = new ArrayList();
31 //获取所有的 Cookie
32 Cookie [] cookies = request.getCookies();
33 //循环
34 for(int i = 0; cookies != null && i < cookies.length; i++){
35 Cookie cookie = cookies[i];
36 //找出合适的 Cookie
37 String cookieName = cookie.getName();
38 if(cookieName.startsWith("cookie_book_")){
39 books.add(cookie.getValue());
40 }
41 }
42 //显示信息
43 if(books.size() > 0){
44 out.print("您曾经浏览过一下图书: ");
45 for(int i = 0; i < books.size(); i++){
46 String bookName = (String)books.get(i);
47 bookName = java.net.URLDecoder.decode(bookName, "UTF-8");
48 out.print(bookName + "&nbsp;&nbsp;&nbsp;");
49
50 }
51 }%>
52 </body>
53 </html>

 

bookDetails.jsp

 

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2
3
4
5 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>
6 <head>
7 <title>
8 My JSP 'bookDetails.jsp' startingpage
9 </title>
10 </head>
11 <body>
12 <%
13 request.setCharacterEncoding("UTF-8");
14 //只保留 最后的 3 个 Cookie
15 String bookName = request.getParameter("book");
16 System.out.println("bookName: ^^^^" + bookName);
17 bookName = java.net.URLEncoder.encode(bookName, "UTF-8");
18 Cookie cookie = new Cookie("cookie_book_" + bookName, bookName);
19 cookie.setMaxAge(60);
20 //Cookie.getPath() 在不显式的调用 setPath 方法前, 返回 null, 不能准确的反应 Cookie 的有效路径
21 out.print("Before setPath, cookie.getPath: " + cookie.getPath() + "<br>");
22 out.print("application.getContextPath(): " + application.getContextPath() + "<br>");
23 //设置 Cookie 的有效路径, Cookie 在有效路径及其子目录下都会发生作用, / 代表 web 站点的根目录
24 cookie.setPath(application.getContextPath());
25 //好用!
26 out.print("After setPath, cookie.getPath: " + cookie.getPath() + "<br>");
27 Cookie [] cookies = request.getCookies();
28 if(cookies != null && cookies.length > 3){
29 Cookie tempCookie = cookies[0];
30 //让第一个 Cookie 失效
31 tempCookie.setMaxAge(0);
32 //并改变浏览器端的文本文件
33 response.addCookie(tempCookie);
34 }
35 response.addCookie(cookie);
36 %>
37 您正在查看的图书是: ${param.book }
38 <a href="books.jsp">Return...</a>
39 </body>
40 </html>


 


  这个例子是看cookie的失效时间的。当

  我浏览的图书超过三本,在输出页面,我们只能看到最近看过的三本书的信息的,

    bookName = java.net.URLEncoder.encode(bookName, "UTF-8");

    这段代码是将中文乱码的情况给考虑进来了!

posted @ 2012-04-06 23:29  磊,go  阅读(498)  评论(0编辑  收藏  举报