cookie与session都是保存会话数据的
Cookie
1. cookie的简述
在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录用户的个人信息(姓名,手机号等)、消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。在Web应用中,Cookie的功能类似于这张会员卡,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中。这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
Cookie将用户的信息保存到客户端浏览器的一个技术,当下次访问的时候,浏览器会自动携带Cookie的信息过来到服务器端.
2. cookie与服务器与浏览器之间的传输
3. cookie的相关API使用
- 创建
Cookie cookie = new Cookie("name", "value");
- 将cookie发送给浏览器
response.addCookie(cookie);
- 接收请求中的cookie
Cookie[] cookies = request.getCookies();
- 别的一些方法
//获取cooke名字
String name = cookie.getName();
//获得cookie的值。
String value = cookie.getValue();
//设置cookie的有效时间。
//如果没有设置,cookie只缓存浏览器缓存中,浏览器关闭,cookie删除。
//如果设置有效时间,在时间范围内,cookie被写入到浏览器端,关闭浏览器下次访问仍可获得,直到过期
cookie.setMaxAge(000);
//设置cookie允许被访问的路径,设置的路径,以及子路径都被允许访问。例如:setPath("/web/a/b");
//常见设置:setPath(“/”) ,当前tomcat下的所有的web项目都可以访问
cookie.setPath("String uri");
4. cookie的分类
- 会话级别的Cookie:默认的.关闭了浏览器Cookie就销毁了.
- 持久级别的Cookie:需要设置有效时长的.关闭浏览器也不会销毁的Cookie.
- setMaxAge(int expiry); 以秒为单位的时间,超过了该时间后Cookie会自动销毁.
- setMaxAge(0),手动删除持久性的Cookie。(前提:path和name必须一致)
- setPath(String uri); 设置Cookie的有效路径.
1)cookie.setPath("/day17/demo");
表示day17 项目下,【demo目录】下所有的servlet,都可以访问当前cookie。但“/day17”或“/day17/aaa”将不能访问。
2)cookie.setPath("/day17");
表示【day17 项目】下的所有servlet都可以访问当前cookie
3)cookie.setPath("/");
表示【tomcat下】的所有的web项目,都可以访问当前cookie
- cookie唯一表示
- 唯一标示:domain + path + name (类似Java中 包 + 类名)
- domain 域名,不同的网站使用的是不同的域名,cookie就不同。
- path 路径,通过cookie.setPath(…)设置的内容。
- name cookie名称,通过 new Cookie(name , …) 确定的内容。
- 如果路径和名称一样,两次addCookie(),后者将覆盖前者。
- 唯一标示:domain + path + name (类似Java中 包 + 类名)
5. 使用cookie保存上次登录时间
public class VisitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1.获得从客户端带过来的所有的Cookie:
* 2.从所有的Cookie中查找指定名称的Cookie:
* 3.判断是否是第一次访问:
* * 是第一次:显示欢迎
* * 不是第一次:显示欢迎 同时显示上次访问时间.
* 4.记录当前的时间,并且利用Cookie将时间回写到浏览器端.
*/
// 获得客户端的所有的Cookie:
Cookie[] cookies = request.getCookies();
// 从cookies的数组中查找指定名称的Cookie:
Cookie cookie = CookieUtils.findCookie(cookies, "visitTime");
// 判断是否是第一次访问:
response.setContentType("text/html;charset=UTF-8");
if(cookie == null){
// 第一次访问
response.getWriter().println("<h1>欢迎来到本网站!</h1>");
}else{
// 不是第一次
long time = Long.parseLong(cookie.getValue());
Date date = new Date(time);
response.getWriter().println("<h1>欢迎来到本网站!您的上次访问时间是:"+date.toLocaleString()+"</h1>");
}
// 记录当前的时间,回写到Cookie中.
Cookie c = new Cookie("visitTime",""+System.currentTimeMillis());
response.addCookie(c);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Session
1. 为什么有的数据用session不用ServletContext和request
- 将数据存放到ServletContext,多个用户共享一个数据
- 将数据存放到request作用域,多次请求不能共享数据。
- session可以保证用户的隐私
2. cookie和session的选取
- Cookie是有大小和个数的限制的.Session存到服务器端的技术,没有大小和个数的限制.
- Cookie相对于Session来讲不安全.
3. session的相关API使用
Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式
- 获取session
//如果session不存在返回null
HttpSession session = request.getSession();
//如果session不存在就自动创建一个
HttpSession session1 = request.getSession(true);
- 相关方法
//用于返回与当前HttpSession对象关联的会话标识号
String id = session.getId();
//返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
long creationTime = session.getCreationTime();
//返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
long lastAccessedTime = session.getLastAccessedTime();
//用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔
session.setMaxInactiveInterval(0);
//判断当前HttpSession对象是否是新创建的
boolean sessionNew = session.isNew();
//用于强制使Session对象无效
session.invalidate();
//用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象
ServletContext servletContext = session.getServletContext();
//用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
session.setAttribute("name","Object value");
//用于从当前HttpSession对象中返回指定名称的属性对象
Object attribute = session.getAttribute("name");
//用于从当前HttpSession对象中删除指定名称的属性
session.removeAttribute("name");