zoukankan      html  css  js  c++  java
  • java基础79 会话管理(Cookie技术、Session技术)

    1、概念

        会话管理:管理浏览器和服务器之间会话过程中产生的会话数据。
        Cookie技术:会话数据保存到浏览器客户端。存 编号/标记(id)
        Session技术:会话技术会保存到服务器端(内存)。 【存 具体值】

    2、Cookie技术(会话数据保存到浏览器客户端)

    2.1、Cookie的核心API

       1、服务器端创建cookie对象
            Cookie cookie=new Cookie(“name”,”value”);
       2、设置Cookie
            void setPath(java.lang.String uri)  
            void setMaxAge(int expiry)  
            void setValue(java.lang.String newValue)
       3、把cookie发送给浏览器端;
            Response.addCookie(cookie);
       4、 浏览器带着cookie信息访问服务器(通过请求头:)
           Cookie[] cookies=request.getCookies(); //服务器接收cookie数据
     局限:
        1、只能保存字符串数据,不能保存中文
        2、一个cookie不能超过4kb

    2.2、Cookie原理

       1)服务器创建cookie对象,把会话数据存储到cookie对象中
            New Cookie(“name”,”value”);
       2)服务器发送cookie到浏览器
            Response.addCookie(cookie);
       3)浏览器得到服务器发送的cookie,然后在保存到浏览器端
            Cookie:name=rose(隐藏带着叫cookie名称的请求头)
       4)服务器接收到浏览器带来的cookie信息
            Request.getCookies();

    2.3、Cookie的细节

        1)SetPath:设置cookie的有效路径。有效路径指保存到哪里,那么浏览器在有效的路径下方访问是就带有cookie信息,否则就不带。
        2)setMaxAge(int time):设置cookie的有效时间。
            正整数:表示cookie]数据保存到浏览器的缓冲目录(硬盘中),数值表示保存的时间。
            负整数:表示cookie保存浏览器的内存中,浏览器关闭cookie就丢失。
                   零:表示删除同名的cookie数据
        3)cookie数据类型值能保存非中文的数据类型。可以保存cookie,但是浏览器一般只允许放300个cookie,每个站点最多只能放20个Cookie,每个cookie的大小限制4Kb

    2.4、实例

    例1

     1 package com.shore.cookie;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.Cookie;
     8 import javax.servlet.http.HttpServlet;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 /*
    12  * 第一个cookie的程序
    13  * */
    14 public class CookieDemo1 extends HttpServlet {
    15     
    16     public void doGet(HttpServletRequest request, HttpServletResponse response)
    17             throws ServletException, IOException {
    18                 
    19         /*request.setAttribute("name","hello");
    20         request.getRequestDispatcher("GetData").forward(request, response);*/
    21         //创建Cookie对象
    22         Cookie cookie1=new Cookie("name","rose");
    23         //Cookie cookie2=new Cookie("email","1314@qq.com");
    24         /*
    25          * 1)设置Cookie的有效路径:默认情况下,有效路径在当前的web应用下./MyCookie
    26          * cookie.setPath("/MyCookie")
    27          * */
    28         //cookie1.setPath("/MyCookie2");
    29         //response.addCookie(cookie2);
    30         /*
    31          * 2)设置cookie的有效时间
    32          * 正数:表示cookie保存到浏览器的缓存目录(硬盘中),数值表示保存时间
    33          * 负整数:表示cookie数据保存浏览器的内存中.浏览器关闭cookie就失效!!
    34          * 零:表示删除同名的cookie数据
    35          * */
    36         cookie1.setMaxAge(100);
    37         //cookie2.setMaxAge(30);//5秒  从最后步调用cookie开始计算的
    38         //cookie1.setMaxAge(-1);
    39         response.addCookie(cookie1);
    40         Cookie[] cookies=request.getCookies();
    41         if(cookies!=null){
    42             for (Cookie c : cookies) {
    43                 String name=c.getName();
    44                 String value=c.getValue();
    45                 System.out.println("name="+name+";value="+value);
    46             }
    47         }else{
    48             System.out.println("没有接收到cookie数据");
    49         }
    50     }
    51 }

    例2

     1 package com.shore.cookie;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.Cookie;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 public class GetData extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         /*String name=(String)request.getAttribute("name");
    16         System.out.println(name);*/
    17         Cookie[] cookies=request.getCookies();
    18         /*if(cookies!=null){
    19         for (Cookie c : cookies) {
    20             String name=c.getName();
    21             String value=c.getValue();
    22             System.out.println("name="+name+";value="+value);
    23         }
    24         }else{
    25             System.out.println("没有接收到cookie数据");
    26         }*/
    27     }
    28 }

    例3

     1 package com.shore.cookie;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.Cookie;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 public class DeleteCookie extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15 
    16         /*
    17          * 需求:删除Cookie
    18          * */
    19         Cookie cookie=new Cookie("name", "xxxx");
    20         cookie.setMaxAge(0);//删除同名cookie
    21         response.addCookie(cookie);
    22         System.out.println("删除成功");
    23     }
    24 }

    3、Session技术(会话数据保存到服务器端[内存])

    3.1Session的核心API

        1、创建和得到Session对象
            HttpSession session=Request.getSession(); //创建或者得到Session对象
            Request.getSession(false); //得到session对象
        2、会话数据保存Session对象中,和得到会话数据
            Session.setAttribute(“name”,Object); //保存数据
            Session.getAttribute(“name”); //得到数据
      注意:
          1、session.setMaxInactiveInterval(时间); //设置session过去时间
          2、session.invalidate(); //手动销毁session对象

    3.2、session细节

        1、getId():得到session编号
        2、两个getSession方法
            1)getSession()/getSession(true):创建或得到session对象。没有匹配的session编号时,会自动创建新的session对象。
            2)getSession(false):得到session对象。没有匹配的session编号时,返回null。
       3、session对象销毁的时间
           3.1、自动销毁session对象
                1)默认情况下,为30分钟,过时 浏览器会自动回收
                2)修改(设置)session的回收时间。
                3)全局修改

              <!-- 修改session的全局有效时间:分钟 -->
              <session-condig>
                      <session-timeout>时间数字</session-timeout>
              </session-condig>

          3.2、手动销毁session对象
               1)直接调用invalidate();方法

    3.3、实例

    SessionDemo1.java文件

     1 package com.shore.session;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.Cookie;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 import javax.servlet.http.HttpSession;
    11 
    12 /**
    13  * @author DSHORE / 2018-9-9
    14  *
    15  */
    16 public class SessionDemo1 extends HttpServlet {
    17 
    18     public void doGet(HttpServletRequest request, HttpServletResponse response)
    19             throws ServletException, IOException {
    20         
    21         //创建session对象
    22         HttpSession session=request.getSession();
    23         //创建cookie对象
    24         Cookie c=new Cookie("JSESSIONID",session.getId());//键值对
    25         session.setMaxInactiveInterval(10); //设置Session的有效时间为10秒
    26         c.setMaxAge(60*60);//3600秒
    27         response.addCookie(c);//把值添加到浏览器的cookie中
    28         session.setAttribute("name","Jack");
    29         System.out.println(session.getId()+"---->SessionDemo1的值");
    30     }
    31 }

    SessionDemo2.java文件

     1 package com.shore.session;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 import javax.servlet.http.HttpSession;
    10 
    11 /**
    12  * @author DSHORE / 2018-9-9
    13  *
    14  */
    15 public class SessionDemo2 extends HttpServlet {
    16 
    17     public void doGet(HttpServletRequest request, HttpServletResponse response)
    18             throws ServletException, IOException {
    19         
    20         //创建session对象
    21         HttpSession session=request.getSession(false);
    22         if(session!=null){
    23             String sessionName=(String)session.getAttribute("name");
    24             System.out.println(sessionName);
    25             System.out.println(session.getId());
    26         }else{
    27             System.out.println("id不对");
    28         }
    29     }
    30 }

    结果图

           

    实例解析:
    1、第一次访问创建的session对象时,给session对象分配一个唯一的id,叫JSESSIONID。
        HttpSession session=request.getSession();
    2、把JSESSIONID作为cookie的值发送给浏览器保存。
        Cookie c=new Cookie("JSESSIONID",session.getId());    
        response.addCookie(c);//把值添加到浏览器的cookie中
    3、第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器。
    4、服务器得到JSESSIONID,并在服务器的内存中搜索是否存在对应编号(id)的session对象。
        if(session!=null){
              String sessionName=(String)session.getAttribute("name");
              System.out.println(sessionName);
              System.out.println(session.getId());
        }else{
          System.out.println("id不对");
        }
    5、如果找到对应编号的session对象,则直接返回该对象。
    6、如果找不到对应编号的session对象,则创建新的session对象,循环第1到底6步(骤)。

    结论:通过cookie(浏览器端的请求头)中的JSESSIONID编号,去服务器中寻找session对象对应的值。

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/9613620.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    HDU3516 树的构造
    poj1160 post office
    poj1260 pearls
    POJ 3709 K-Anonymous Sequence
    HDU2829
    HDU 3480 division
    HDU3507 print artical
    HDU2490 parade
    HDU3530 子序列
    HDU3415
  • 原文地址:https://www.cnblogs.com/dshore123/p/9613620.html
Copyright © 2011-2022 走看看