• Cookie&Session-授课


    1 会话技术

    1.1 会话管理概述

    1.1.1 什么是会话

    会话:浏览器和服务器之间的多次请求和响应

    为了实现一些功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器,到了过期时间)。这期间产生的多次请求和响应加在一起就称之为浏览器和服务器的一次会话。

    会话中产生的一些数据,可以通过会话技术(Cookie和Session)保存

    Cookie介绍

      把要共享的数据保存到客户端

      每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享!

    作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率

    Cookie属性

    属性名称属性作用是否重要
    name cookie的名称 必要属性
    value cookie的值(不能是中文) 必要属性
    path cookie的路径 重要
    domain cookie的域名 重要
    maxAge cookie的生存时间。 重要
    version cookie的版本号。 不重要
    comment cookie的说明。 不重要

     

     

    Cookie方法

    方法名                                                              作用

    Cookie(String namg,String value)            构造方法创建对象

    属性对应的set和get方法           赋值和获取值

     

    Cookie添加和获取

    添加:HttpSerletResponse

    返回值                                   方法名                                                说明 

    void           addCookie(Cookie cookie)   向客户端添加Cookie

    获取:HttpServletRequest

    返回值                                   方法名                                                说明

    Cookie[]        getCookies()           获取所有的Cookie

     

    Cookie的使用

    需求说明 

      通过Cookie记录最后访问时间,并在浏览器上显示出来

    最终目的

      掌握Cookie的基本使用,从创建到添加客户端,再到从服务器端获取

    实现步骤:

      1.通过响应对象写出一个提示信息

      2.创建Cookie对象,指定name和value

      3.设置Cookie最大存活时间

      4.通过响应对象将Cookie对象添加到客户端

      5.通过请求对象获取Cookie对象

      6.将Cookie对象中的访问时间写出

    package com.itheima.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /*
     * Cookie的使用
     * */
    @WebServlet("/servletDemo01")
    public class ServletDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //  1.通过响应对象写出一个提示信息
                resp.setContentType("text/html;charset=utf-8");
                PrintWriter pw=resp.getWriter();
                pw.write("欢迎访问本网站,您的最后访问时间为:<br>");
            //  2.创建Cookie对象,指定name和value
            Cookie cookie=new Cookie("time",System.currentTimeMillis()+"");
            //  3.设置Cookie最大存活时间
            cookie.setMaxAge(3600);//一个小时
            //  4.通过响应对象将Cookie对象添加到客户端
            resp.addCookie(cookie);
            //  5.通过请求对象获取Cookie对象
            Cookie[] arr = req.getCookies();
            for(Cookie c:arr){
                if ("time".equals(c.getName())){
                //  6.将Cookie对象中的访问时间写出
                    String value=c.getValue();
                    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    pw.write(sdf.format(new Date(Long.parseLong(value))));
                }
            }
    
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

      

    细节

    数量限制

    Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。同时,所有网站的cookie总数不超过300个。

    名称限制

    Cookie的名称只能包含ASCCI码表中的字母,数字字符。不能包含逗号,分号,空格,不能以$开头

    存活时间限制setMaxAge()方法接收数字

    负整数:当前会话有效,浏览器关闭则清除

    0:立即清除

    正整数:以秒为单位设置存活时间

     

    访问路径限制

    取自第一次访问的资源路径前缀

    只要以这个前缀为开头(包括子级路径)。获取到

    反之获取不到

    设置路径:setPath()方法设置指定路径

     

     Session

    HttpSession介绍

    HttpSession:服务器端会话管理技术

    本质也是采用客户端会话管理技术

    只不过在客户端保存的时一个特殊标识,而共享的数据保存到了服务器端的内存对象中。

    每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享!

    是Servlet规范中四大域对象之一的会话域对象

     

    作用:可以实现数据共享

    域对象                          功能                                 作用

    ServletContext          应用域                   在整个应用之间实现数据共享

    ServletRequest         请求域                    在当前的请求或请求转发之间实现数据共享

    HttpSession               会话域                    在当前会话范围之间实现数据共享

     

     HttpSession常用方法

    返回值                               方法名                                    说明

    void       setAttribute(String name,Object value)    设置共享数据

    Object      getAttribute(String name)          获取共享数据

    void        remove(String name)           移除共享数据

    String       getId()                获取唯一表标识名称

    void        Invalidate()                让session立即失效

     

    HttpSession获取

    HttpSession实现类对象是通过HttpServletRequest对象来获取。

    返回值                               方法名                                 说明

    HttpSession      getSession()    获取HttpSession对象

    HttpSession      getSession(boolean create)  获取HttpSession对象,未获取到是否自动创建

     

    服务器端内存空间   【001】

    客户端-------getSession()------查看是否携带Jsessionid的值------带了001----根据该值在服务器端查找是否有HttpSession对象

            ||

       ||       没有

    创建新的HttpSession对象  分配唯一标志Jsessionid

     

     

     客户端-------getSession()------查看是否携带Jsessionid的值

       ||

       ||       没有

    创建新的HttpSession对象  分配唯一标志Jsessionid 将唯一标识发送给客户端

     

    HttpSession的使用

    需求说明:

      通过第一个Servlet设置共享数据用户名,并在第二个Servlet获取到在显示出来

    最终目的:

      掌握HttpSession的基本使用,如何获取和使用

    实现步骤:

    1.在第一个Servlet中获取请求的用户名

    2.获取HttpSession对象

    3.将用户名设置到共享数据中

    4.在第二个Servlet中获取HttpSession对象

    5.获取共享数据用户名

    6.将获取到用户名响应给客户端浏览器

    servletDemo01

    package com.itheima.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.SessionCookieConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    /*
    *
    *Session的基本使用
    *
    * */
    @WebServlet("/servletDemo01")
    public class ServletDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取到请求的用户名信息
            String username = req.getParameter("username");
    
            //获取到HttpSession的对象
            HttpSession session = req.getSession();
            System.out.println(session);
            System.out.println(session.getId());
    
            //将用户名信息添加到共享数据中
            session.setAttribute("username",username);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

      

    ServletDemo02

    package com.itheima.servlet;
    
    import javax.jws.soap.SOAPBinding;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    /*
    *
    *Session的基本使用
    *
    * */
    @WebServlet("/servletDemo02")
    public class ServletDemo02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取到HttpSession 对象
            HttpSession session = req.getSession();
    
    
            //获取到共享数据
            Object username = session.getAttribute("username");
            System.out.println(session);
            System.out.println(session.getId());
    
            //将数据响应给浏览器
            resp.getWriter().write(username+"");
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

     

     

    HttpSession的细节

     

    1.3.2 HttpSession的入门案例

    1)需求说明

    在请求HttpSessionDemo1这个Servlet时,携带用户名信息,并且把信息保存到会话域中,然后从HttpSessionDemo2这个Servlet中获取登录信息。

    2)案例目的

    通过本案例的讲解,同学们可以清楚的认识到会话域的作用,即多次请求间的数据共享。因为是两次请求,请求域肯定不一样了,所以不能用请求域实现。

    最终掌握HttpSession对象的获取和使用。

    3)原理分析

    HttpSession,它虽然是服务端会话管理技术的对象,但它本质仍是一个Cookie。是一个由服务器自动创建的特殊的Cookie,Cookie的名称就是JSESSIONID,Cookie的值是服务器分配的一个唯一的标识。

    当我们使用HttpSession时,浏览器在没有禁用Cookie的情况下,都会把这个Cookie带到服务器端,然后根据唯一标识去查找对应的HttpSession对象,找到了,我们就可以直接使用了。下图就是我们入门案例中,HttpSession分配的唯一标识,同学们可以看到两次请求的JSESSIONID的值是一样的:

     HttpSession的细节

    浏览器禁用Cookie

    方式一:通过提示信息告知用户,大部分网站采用的解决方式。(推荐)

    方式二:访问时拼接jsessionid标识,通过encode URL()方法重写地址(了解)

    钝化和活化

    什么是钝化和活化

      钝化:序列化。把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上

      活化:相反的状态

    什么时候使用持久化

    第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行序列化。

    第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行序列化

    注意

    HttpSession的持久化由服务器来负责管理,我们不用关心。

    只有实现了序列化接口的类才能被序列化,否则不行。

     

     

     

     

     

     

     

     

     

     

     

    ------------恢复内容结束------------

  • 相关阅读:
    算法:二分图最大独立集
    算法:桶排序
    算法:二分图最小点覆盖——Konig定理
    jQuery基础整理之思维导图
    vue基础知识整理
    HTML总结
    JAVAScript总结
    栈和队列
    今日学习遇到的问题(2018.9.23)
    看了vue文档之后。。。。
  • 原文地址:https://www.cnblogs.com/faded8679/p/14551676.html
Copyright © 2020-2023  润新知