美文网首页
Servlet五——Cookie

Servlet五——Cookie

作者: 嗷老板 | 来源:发表于2018-04-08 17:21 被阅读0次

一、会话技术的概述

  会话技术可以简单理解为,一个用户打开一个浏览器,在同一个WEB应用上,点击多个超链接,访问多个WEB资源,然后关闭浏览器,这样的整个过程我们称为一个会话。

1、会话的作用

  • 会话技术可以保存用户在会话过程中所产生的数据
  • 会话技术也可以让用户在同一个会话中实现数据的共享
      我们平常在浏览网页的时候一些不太重要信息,例如:上次访问的时间、记住用户名等,都可以使用会话技术存储,简单来讲会话技术就是用来临时保存数据的。

2、会话技术的分类

  • Cookie
      cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set-cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上,当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
      cookie存在浏览器,由服务器创建,随着响应带到浏览器,然后浏览器做临时保存,保存完之后,下次请求再带回去。
      优点:减少服务器的压力,服务器内存可以少用一点
      缺点:
        (1)换一个浏览器后cookie就无法获取;
        (2)随时都会被清理,适合保存不重要的东西;
        (3)带来带去,占用带宽,适合存小的东西,如果过大,用户等待的时间很长;
        (4)数据传来传去,不安全
      总结:不必要的,比较小的,不涉及安全性的内容,用cookie
  • session
      session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象,由于Session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
      session对象是一个域对象,通过setAttribute、getAttribute和removeAttribute保存查询删除数据。

二、Cookie应用案例——记录用户上次访问的时间

步骤:
  (1)获取指定的cookie信息
  (2)判断是否为null
    如果为null,给出提示信息
    否则获取上次访问时间,并显示
  (3)获取当前的时间存入cookie中,发到客户端

package com.itheima.cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
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 CookieDemo extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流
        PrintWriter out = response.getWriter();
        
        //获取cookie信息
        Cookie[] cookies = request.getCookies();
        Cookie cookie = null;
        
        if(cookies != null){
            for (int i = 0; i < cookies.length; i++) {
                String name = cookies[i].getName();
                if("lastAccessTime".equals(name)){
                    cookie = cookies[i];
                    break;
                }
            }
        }
        
        //判断是否有上次访问时间
        if(cookie == null){
            //如果没有上次的访问时间,需要给出提示信息
            out.println("欢迎第一次访问");
        }else{
            //如果有上次访问的时间,获取上次访问时间,并显示
            String value = cookie.getValue();
            out.print("您上次访问的时间为"+value);
        }
        
        //获取本次访问的时间
        SimpleDateFormat sdf= new SimpleDateFormat("yy-MM-dd HH:mm:ss");
        String now = sdf.format(new Date());
        
        //创建cookie对象
        Cookie c = new Cookie("lastAccessTime", now);
        //记录用户访问时间,发送至客户端
        response.addCookie(c);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
第一次访问
再次访问

案例的优化

  如果我们在获取指定cookie对象时,每次都要写遍历整个集合的代码,这样非常麻烦,我们可以将获取指定cookie对象的方法封装到一个工具类中,直接调用方法获取指定的cookie对象。
CookieUtils

import javax.servlet.http.Cookie;

public class CookieUtils {
    private CookieUtils(){}
    
    public static Cookie getCookie(Cookie[] cookies,String name){
        Cookie cookie = null;
        if(cookies != null){
            for (int i = 0; i < cookies.length; i++) {
                String cookieName = cookies[i].getName();
                if(cookieName.equals(name)){
                    cookie = cookies[i];
                }
            }
        }
        return cookie;
    }
}

改写案例

import javax.servlet.http.Cookie;

public class CookieUtils {
    private CookieUtils(){}
    
    public static Cookie getCookie(Cookie[] cookies,String name){
        Cookie cookie = null;
        if(cookies != null){
            for (int i = 0; i < cookies.length; i++) {
                String cookieName = cookies[i].getName();
                if(cookieName.equals(name)){
                    cookie = cookies[i];
                }
            }
        }
        return cookie;
    }
}

三、Cookie的常用方法

1、构造方法

  Cookie常用的构造方法有两个参数,对应cookie对象了name和value属性。

    Cookie(String name,String value);

2、获取名称

  作用:获取cookie对象的name属性
  返回值:String类型的字符串

    String getName();

3、获取值

  作用:获取cookie对象的value属性
  返回值:String类型的字符串

    String getValue();

4、设置有效时间(过期时间)

  作用:设置cookie对象的有效时间,参数以毫秒为单位
  返回值:void

    //有效期一天
    cookie.setMaxAge(60 * 60 * 24);
    //当浏览器关闭,会话结束后cookie会自动的被删除
    cookie.setMaxAge(-1);
    //cookie会立刻被删除
    cookie.setMaxAge(0);
    //最长的有效时间
    cookie.setMaxAge(Integer.MAX_VALUE);

5、设置路径

  作用:设置cookie对象的保存路径
  返回值:void

    //cookie的默认路径是当前WEB应用的根路径
    cookie.setPath("/myCookie");
    //推荐使用这个方法,比较灵活
    cookie.setPath(request.getContextPath());

四、Cookie的细节

  • 一个cookie只能用来标识一种信息,而cookie至少需要包含这个信息的名称和值;
  • 一个网站可以向一个浏览器提供多个cookie,而一个浏览器也可以接收多个网站提供的cookie
  • 一个浏览器一般最多可以接受300个cookie,一个网站所对应的cookie最多为20个,一个cookie大小限制为4kb
  • 创建一个cookie对象,发送至客户端,那这个cookie他默认的级别是会话级别
      会话级别:当用户关闭浏览器,会话结束了,那这个cookie也被删除了
      如果需要把cookie保存在用户的硬盘上,需要设置cookie的有效时间(过期时间)
  • cookie的名称和值都不可以使用中文,因为中文被认为是不安全的字符

相关文章

网友评论

      本文标题:Servlet五——Cookie

      本文链接:https://www.haomeiwen.com/subject/knzfhftx.html