欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

cookie和session学习

程序员文章站 2024-02-28 08:55:22
...

cookie和session对比

  • cookie特点:
    • 1) 会话数据存放在浏览器
    • 2) 数据类型只能是String,而且有大小限制
    • 3) 数据存放不安全
  • session特点:
    • 1)会话数据存放在服务器(服务器内存)
    • 2) 数据类型任意,没有大小限制
    • 3) 相对安全

cookie技术原理

  • 服务器创建cookie对象,保存会话数据,把cookie数据发送给浏览器
  • 浏览器获取cookie数据,保存到浏览器缓存区,然后在下次访问服务器携带cookie数据
  • 服务器获取浏览器发送的cookie数据

cookie简单使用

//1. 创建cookie对象,保存会话数据
        Cookie cookie = new Cookie("name", "yangqing");

        //2. 把cookie发送给浏览器,通过响应头携带cookie给浏览器
    //  response.setHeader("set-cookie", "name=yangqing");

        //简化方式:
        response.addCookie(cookie);

        //3. 浏览器在下次访问的时候携带cookie数据,通过请求头发送给服务器
        //浏览器自发进行

        //4. 服务器获取浏览器发送的cookie
        //(1)String name = request.getHeader("cookie");
        //System.out.println(name);
        //(2)
        Cookie[] cookies = request.getCookies();
        for(Cookie c:cookies){
            String name = c.getName();
            String value = c.getValue();
            System.out.println(name+": "+value);
        }

    cookie细节

    • cookie的数据类型一定是字符串,如果发送中文,需要通过URLEncoder进行加密,和URlDecoder进行解密。
    • setPath(path):默认情况下,是当期项目的根目录下,可以通过setpath更改,如果把该cookie设置到某个有效路径下,只有当访问该有效路径的时候才会携带该cookie信息
    • setMaxAge(整数): 设置cookie的有效时间。
      • 正整数:表示超过了正该值cookie会丢失(cookie保存到浏览器的缓存中),单位:秒。
      • 负整数:表示如果浏览器关闭了,cookie就会消失(cookie保存在浏览器的内存中)
      • 0:表示删除同名的cookie
    • cookie可以有多个,浏览器一般存放300个cookie,每个站点最多存放20个,每个cookie大小限制为4K

    Session原理

    • 1 服务器创建session对象,服务器给这个session对象分配一个唯一的标记JSESSIONID
    • 2 把JSESSIONID作为cookie发送给浏览器
    • 3 浏览器得到JSESSIONID保存下来,在下次访问的时候发送给服务器。
    • 4 服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSESSIONID的session对象
    • 5 如果找到,则返回该session对象
    • 6 如果找不到,可能返回null,也有可能创建一个session。

    以上六个步骤,都在下面这句话中执行了。
    HttpSession session = request.getSession();

    Session使用步骤

    • 创建HttpSession对象,用于保存会话数据。
      request.getSession();//创建或获取session
    • 修改HttpSession对象
      setMaxInactiveInterval();
    • 保存会话数据(作为域对象)
      session.setAttribute(“name”, “yangqing”);
    
            //创建或者获取session对象
            HttpSession session = request.getSession();
            //修改session
            session.setMaxInactiveInterval(20);//20秒后session对象将要被销毁
            //保存会话数据(作为域对象)
            session.setAttribute("name", "yangqing");

    session细节

    • 1 setMaxInactiveInterval(秒):设置session对象的有效时间
      可以在web根目录下统一设置session有效期
     <!-- 设置全局的session有效期(分钟) -->
      <session-config>
        <session-timeout>1</session-timeout>
      </session-config>
       问题:session在什么时候会销毁
      
          默认情况下:30分钟后销毁
      
      
        • 2 设置JSESSIONID不会随着浏览器的关闭而关闭
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
                cookie.setMaxAge(1*30*24*60*60);//设置一个月的有效期
                response.addCookie(cookie);
        
        
        • 3 通过invalidate()方法直接销毁session对象
        • 4 request.getSession()//request.getSession(true):查询session对象,如果没有session对象,创建新的
          request.getSession(false):如果没有session对象,返回null。

        HttpSession常用方法

        列举它的常用方法:

        • setAttribute(),向HttpSession中保存数据;
        • getAttribute(),从HttpSession中获取数据;
        • removeAttribute(),从HttpSession中移除数据;
        • getId(),返回HttpSession的唯一标识符;
        • setMaxInactiveInterval(),设置session的存活时间(单位是秒),默认为30分钟;
        • invalidate(),销毁HttpSession。

        HttpSession举个例子

        我们来写个伪代码来在结账时判断用户是否已经登录了。

        登录LoginServlet,结账PayServlet,用户User。

        先贴代码:

        LoginServlet.class

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            HttpSession session = request.getSession(true);
            final String name =request.getParameter("name");
            final String password = request.getParameter("password");
            final User user = new User(name, password);
            session.setAttribute(LOGIN_SESSION, user);
            System.out.println("保存Session成功!");
        }
        

        PaySession.class

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            HttpSession session = request.getSession();
            Object obj = session.getAttribute(LoginServlet.LOGIN_SESSION);
            if( obj==null ){
                System.out.println("请先登录!");
                return;
            }
            if( obj instanceof User ){
                User user = (User) obj;
                System.out.println("已经登录了");
                System.out.println(user.getName() + ":" + user.getPassword() );
            }
        }
        

        我们先描述一下需求:

        1.直接调用PayServlet,看看是否能支付成功(应该提醒未登录);
        2.调用LoginServlet登录,设置用户名和密码;
        3.再调用PayServlet,这次应该能登陆且打印登录信息;

        我们来看一看实际情况

        // 1. 在浏览器中打开链接
        http://localhost:8080/MyHttpSession/servlet/PayServlet
        发现提示"请先登录!",和预期一致
        
        // 2. 再登录,在浏览器打开链接
        http://localhost:8080/MyHttpSession/servlet/LoginServlet?name=qdl&password=qi123456
        发现提示"保存Session成功!"
        
        // 3. 再次付款打开链接
        http://localhost:8080/MyHttpSession/servlet/PayServlet
        发现提示
        "已经登录了"
        "qdl:qi123456"
        和预期一致
        
        // 4.我们销毁一下HttpSession然后将其存活时间改为10s
        执行步骤1-2-3,然后重复执行3,发现刚开始提示已经登录,不一会变成了请先登录的提示了,这时说明HttpSession失效了
        另外虽然我们设置的失效时间为10s,但是实际测试时感觉时间有些许偏差。