您的位置:首页 > 其它

Servlet从入门到精通十 ——会话管理——Cookie

2012-12-06 19:38 405 查看
会话管理——Cookie

会话主要内容:怎样保存、获取、操作用户数据。

会话:可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个Web资源,然后关闭浏览器,整个过程称之为一个会话。

会话过程中要解决的一些问题?

每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。

例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结账servlet时,结账servlet可以得到用户商品为用户结账。

思考:用户购买的商品保存在request或servletContext中行不行?

不能存在request中,因为一个用户请求(输入一个网址),会产生一个request。当用户点击购买产生一个request,又点击付款会再产生一个新的request。如下图:



但是如果点击购买后,利用forward转发给payservlet可以共用一个request。但这样用户体验不好,点击购买,马上转发到结账。即你点购买,网站就让你结账,多烦啊。



存在ServletContext更不行,因为它是共享的,所有请求只产生一个ServletContext。

那么在web开发中保存用户数据用什么方法呢?

Cookie和Session。

一、保存会话数据的两种技术:

1、Cookie:是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。

当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。

这样,web资源处理的就是用户各自的数据了。



2、Session:是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,

由于session为用户浏览器独享,所以用户在访问服务器的web资源时,

可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,

其它web资源再从用户各自的session中取出数据为用户服务。

二、Cookie API

Javax.servlet.http.Cookie类用于创建一个Cookie,response接口中也定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类的方法:

1、public Cookie(java.lang.String name, java.lang.String value)

2、setValue和getValue

3、setMaxAge和getMaxAge

4、setPath和getPath

5、setDomain和getDomain 这两个方法设定的Cookie通常会被浏览器禁用,因为它们都是第三方Cookie,容易对别的网站造成安全隐患。

6、getName方法 获取Cookie的名称

例1、显示用户上次访问时间

新建Java Web project:Day07,在Day07src下新建一个Servlet:CookieDemo1 ,代码如下:

package cn.itcast.cookie;

import java.io.*;

import java.util.Date;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class CookieDemo1 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

PrintWriter out =response.getWriter();

out.print("您上次的访问时间是:");

//获得用户的时间Cookie

Cookie cookies[]=request.getCookies();

for(int i=0;cookies!=null && i<cookies.length;i++)

{

if(cookies[i].getName().equals("lastAccessTime")){

//得到用户上次访问的时间

long cookieValue =Long.parseLong(cookies[i].getValue());

Date date =new Date(cookieValue);

out.print(date.toLocaleString());

}

}

//给用户送去上次访问时间

Cookie cookie =new Cookie("lastAccessTime",System.currentTimeMillis()+"");

cookie.setMaxAge(1*30*24*3600);

cookie.setPath("/Day07");

response.addCookie(cookie); //把cookie写给浏览器

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

在浏览器中输入:http://localhost:8088/Day07/servlet/CookieDemo1

结果是: 您上次的访问时间是:

刷新后,结果是: 您上次的访问时间是:2012-12-5 16:31:28

再刷新.......

三、Cookie细节

1、一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。

2、一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器可以存储多个WEB站点提供的Cookie。

3、浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

4、如果创建了一个Cookie,并将他发送到浏览器,默认情况下它是一个会话级别的Cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在硬盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该Cookie。

5、注意,删除cookie时,path必须一致,否则不会删除。

例2、删除Cookie
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: