Cooike与Session

cookie与session都是保存会话数据的

Cookie

1. cookie的简述

在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡,卡上记录用户的个人信息(姓名,手机号等)、消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。在Web应用中,Cookie的功能类似于这张会员卡,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中。这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。

Cookie将用户的信息保存到客户端浏览器的一个技术,当下次访问的时候,浏览器会自动携带Cookie的信息过来到服务器端.

2. cookie与服务器与浏览器之间的传输

在这里插入图片描述

3. cookie的相关API使用

  1. 创建
Cookie cookie = new Cookie("name", "value");
  1. 将cookie发送给浏览器
response.addCookie(cookie);
  1. 接收请求中的cookie
Cookie[] cookies = request.getCookies();
  1. 别的一些方法
//获取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的分类

  1. 会话级别的Cookie:默认的.关闭了浏览器Cookie就销毁了.
  2. 持久级别的Cookie:需要设置有效时长的.关闭浏览器也不会销毁的Cookie.
  3. setMaxAge(int expiry); 以秒为单位的时间,超过了该时间后Cookie会自动销毁.
  4. setMaxAge(0),手动删除持久性的Cookie。(前提:path和name必须一致)
  5. 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

  1. cookie唯一表示
    1. 唯一标示:domain + path + name (类似Java中 包 + 类名)
      1. domain 域名,不同的网站使用的是不同的域名,cookie就不同。
      2. path 路径,通过cookie.setPath(…)设置的内容。
      3. name cookie名称,通过 new Cookie(name , …) 确定的内容。
    2. 如果路径和名称一样,两次addCookie(),后者将覆盖前者。

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

  1. 将数据存放到ServletContext,多个用户共享一个数据
  2. 将数据存放到request作用域,多次请求不能共享数据。
  3. session可以保证用户的隐私

2. cookie和session的选取

  1. Cookie是有大小和个数的限制的.Session存到服务器端的技术,没有大小和个数的限制.
  2. Cookie相对于Session来讲不安全.

3. session的相关API使用

Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式

  1. 获取session
//如果session不存在返回null
HttpSession session = request.getSession();
//如果session不存在就自动创建一个
HttpSession session1 = request.getSession(true);
  1. 相关方法
//用于返回与当前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");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值