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

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

posted @ 2018-09-09 14:32  DSHORE  阅读(336)  评论(0编辑  收藏  举报