Web 基础12 会话技术及其Cookie对象入门

1.1 会话技术简介

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

1.1.1 会话技术作用

  • 会话技术可以保存用户在会话过程中所产生的数据

  • 会话技术也可以让用户在同一个会话中实现数据的共享

  • 会话应用场景的思路风暴

  • 想保存数据到购物车 不重要 个人私有

    • 保存哪里 服务器? 数据库 淘宝 京东 不登录
    • 编程最重要的域对象 域对象 临时存储数据
      • 浏览器

        • 可能会被清掉 服务器怎么知道浏览器里面有购物车数据
        • 每次访问服务器的时候把这个数据给带过去
      • 服务器

        • 占用空间 弄混 我怎么识别这个数据是谁的
        • 我怎么让用户证明这个数据是他的
      • 存在浏览器,主要问题是带来带去 存服务器主要问题是

      • 我要识别这个数据是谁的

      • 归根到底: 会话技术就是用来临时保存数据的

1.1.12 会话技术分类

  • cookie

    • cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set- cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上,
    • 当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
  • session

    • session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象,
    • 由于session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
    • session对象也是一个域对象,范围是整个会话
  • 注意:

    • cookie 把数据保存在用户的硬盘上
    • session 把数据保存在服务器的内存上
  • 会话: 打开淘宝--浏览--关闭 一个会话

    • cookie
      • 存在浏览器
        • 服务器先创建出来
        • 随着响应带到浏览器,然后浏览器做临时保存,保存完之后,下次请求在带回去
      • 优点:
        • 减少服务器的压力,服务器内存可以少用一点
      • 缺点:
        • 换一个浏览器就获取不到
        • 随时都会被清理,适合保存不重要的东西
        • 带来带去,占用带宽,适合存小的东西,如果过大,用户等待的时候很长
        • 数据传来传去, 不安全
      • 总结: 不必要的,比较小的,不涉及安全性的内容,用cookie
    • session
      • 存在服务器
      • session 就是一个域对象,(setAttribute getAttribute,removeAttribute),就是通过这个保存数据

1.2 Cookie 常用方法

1.2.1 Cookie的方法

方法 描述
Cookie(String name, String value) Constructs a cookie with a specified name and value.
void setMaxAge(int expiry) Sets the maximum age of the cookie in seconds.
void setPath(String uri) Specifies a path for the cookie to which the client should return the cookie.
String getName() Returns the name of the cookie.
String getValue() Returns the value of the cookie.

1.2.2 关于Cookie对象的方法

Cookie[] cs = request.getCookies();

得到的是一个数组,通过遍历可以得到自己想要的Cookie信息

添加Cookie对象

response.addCookie(c);

其中参数c 为cookie对象

设置有效时间

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

设置路径

void setPath(String uri)//雾霾 江苏  南京市 上海 
当用户访问这个路径下的web资源,或者是这个路径下子路径的资源,他都会自动携带这个cookie
cookie.setPath("/myCookie");//cookie的默认路径是当前WEB应用的根路径
cookie.setPath(request.getContextPath());//推荐使用这个方法,比较灵活

1.2.3 关于Cookie的一些细节

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

1.3 Cookie 入门案例

图解

Web 基础12 会话技术及其Cookie对象入门_第1张图片
记录用户上次访问时间分析.png

1.3.1 记录用户上次的访问时间

思路整理

  • 拿到指定的cookie信息
  • 判断是否为null
    • 如果为null,给出提示信息
    • 否则,获取上次的访问时间,并显示
  • 获得当前的时间存在cookie当中,发到客户端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //记录用户上次的访问时间
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        //获取cookie信息
        Cookie[] cs = request.getCookies();
        
        if(cs != null) {
            for (int i = 0; i < cs.length; i++) {
                String name = cs[i].getName();
                if("lastAccessTime".equals(name)) {
                    cookie = cs[i];
                    break;
                }
            }
        }
        
        //判断是否有上次的访问时间
        if(cookie == null) {
            //如果没有上次的访问时间,需要给出提示信息
            out.println("欢迎第一次访问");
        }
        else {
            //如果有上次的访问时间,需要获取上次的访问时间并显示
            String value = cookie.getValue();
            out.println("您上次的访问时间为:" + value);
        }
        
        
        
        
        //获取这次的访问时间(当前的系统时间)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String now = sdf.format(new Date());
        
        //创建Cookie对象
        Cookie c = new Cookie("lastAccessTime",now);
        //记录用户这次的访问时间,并发送至客户端
        response.addCookie(c);
         
    }

1.3.2 记住用户名

登录页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        Cookie[] cs = request.getCookies();
        Cookie cookie = CookieUtils.getCookie(cs, "username");
        String username = "";
        String checked = "";
        
        if (cookie != null) {
            username = cookie.getValue();
            checked = "checked = 'checked'";
        }
        
        out.println("");
        out.println("");
        out.println("登录页面");
        out.println("");
        out.println("");
        out.println("
"); out.println("用户名:"); out.println("
"); out.println("密码:"); out.println("
"); out.println(""); out.println("记住用户名"); out.println("
"); out.println(""); out.println(""); }

跳转页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        out.println("

我是首页

"); }

处理页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        //获取用户名
        String username = request.getParameter("username");
        //获取密码
        String password = request.getParameter("password");
        //获取复选框记住用户名的值
        String remember = request.getParameter("remember");
        
        System.out.println(username);
        System.out.println(password);
        
        //判断用户名和密码是否有效
        if ("itcast".equals(username) && "123456".equals(password)) {
            //登录成功
            out.println("登录成功,3秒后跳转首页");
            response.setHeader("Refresh", "3;URL=/myCookie/IndexServlet");
            
            if ("1".equals(remember)) {
                //需要记住用户名
                //创建Cookie对象
                Cookie cookie = new Cookie("username", username);
                //设置cookie的有效时间
                cookie.setMaxAge(Integer.MAX_VALUE);
                //发送cookie至客户端
                response.addCookie(cookie);
            }else {
                //不需要记住用户名
                Cookie cookie = new Cookie("username", "");
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
            
        }else {
            //登录失败
            out.println("用户名或者密码错误,3秒后跳转到登录页面");
            response.setHeader("Refresh", "3;URL=/myCookie/LoginUIServlet");
        }
    }

你可能感兴趣的:(Web 基础12 会话技术及其Cookie对象入门)