• 04_web基础(五)之cookie与session


    29.Http协议无记忆带来的问题

      什么是会话:
    可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话。


    在一次会话中,可以点击多个超链接,可以看到多张图片,多个样式等,每一个资源都是发送一个请求和响应得到的.
      在一次会话中,包含多次请求.

    什么是会话跟踪:
    HTTP是无状态协议,没有记忆力,不知道哪一个客户端请求了自己,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。
    在一次会话中多次请求共享数据即会话跟踪技术.
    需求:实现会话跟踪的解决方案:
       解决在一次会话中多个请求不能共享数据的问题.
    ---------------------------------------------------------------------
    解决方案:
       1:使用参数机制在多个请求之间传递.
          可以完成功能,但是不可行(不安全,在浏览器地址栏暴露了所有信息.)
           不安全的注意问题:把信息暴露在地址栏.
           解决方案:让信息不显示在浏览器地址栏, 就是Cookie
       2:Cookie:
            放在请求头中:
       3:Session:
    什么是会话:
    可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话。


    在一次会话中,可以点击多个超链接,可以看到多张图片,多个样式等,每一个资源都是发送一个请求和响应得到的.
      在一次会话中,包含多次请求.

    什么是会话跟踪:
    HTTP是无状态协议,没有记忆力,不知道哪一个客户端请求了自己,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。
    在一次会话中多次请求共享数据即会话跟踪技术.
    需求:实现会话跟踪的解决方案:
       解决在一次会话中多个请求不能共享数据的问题.
    ---------------------------------------------------------------------
    解决方案:
       1:使用参数机制在多个请求之间传递.
          可以完成功能,但是不可行(不安全,在浏览器地址栏暴露了所有信息.)
           不安全的注意问题:把信息暴露在地址栏.
           解决方案:让信息不显示在浏览器地址栏, 就是Cookie
       2:Cookie:
            放在请求头中:
       3:Session:

    30.31.32.cookie

      Cookie的操作:
    1):创建Cookie和设置共享数据:
      Cookie c = new Cookie(String name,String value);
      Cookie c = new Cookie("curreentName","wuji");
    2):把Cookie放入响应中,把Cookie的共享数据传递给浏览器,由浏览器保存.
      response对象.addCookie(c);
    3):获取Cookie和Cookie中的数据.(从请求中获取)

    4):Cookie的name和value不支持中文.
       解决方案:对中文做编码和解码.
    //放:
     String msg="你好";
            String encode = URLEncoder.encode(msg, "UTF-8");
            System.out.println(encode);
            Cookie c2 = new Cookie("curreentName2",encode);
    //取:
                String name = cookie.getName();
                String value = cookie.getValue();
                String decode = URLDecoder.decode(value, "UTF-8");

    5):修改Cookie指定名的value值.
       方式1: 根据name获取被修改的Cookie对象,在调用setValue方法即可.
       方式2: 重新创建一个同名的Cookie.

       注意:修改之后,要调用response对象.addCookie(c);

    6):Cookie的生命周期:(Cookie中的共享数据可以保留多久)
       缺省情况:关闭浏览器Cookie就丢失了.
       通过Cookie对象的setMaxAge(int seconds):设置Cookie可以存活多久.
          seconds>0:可以存活多少秒.
          seconds<0:存放在浏览器进程中,闭浏览器Cookie就丢失了.
          seconds=0:删除Cookie.
    7):删除Cookie:
       Cookie对象.setMaxAge(0);
    8):Cookie的缺陷.
       1>:中文处理麻烦.
       2>:多人共用同一台电脑,信息不安全.
       3>:一个Cookie只能存储一个简单类型的数据.
          若要同时存储,账号,密码,邮件等等.
          主要的原因是:Cookie的value只能存储String,不能存Object.
       4>:Cookie的大小和数量限制:
            Cookie大小限制在4KB之内;

           * 一台服务器在一个客户端最多保存20个Cookie;

           * 一个浏览器最多可以保存300个Cookie;
       5>:Cookie的原理:把共享数据存储在浏览器中.
             每次请求,再把共享数据带到服务端.

    代码:

     1 package com.day07.web.demo2.controller;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.Cookie;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 import java.io.IOException;
    10 import java.io.PrintWriter;
    11 
    12 /**
    13  * Created by Administrator on 2017/12/7.
    14  */
    15 @WebServlet("/cookie")
    16 public class CookieServlet extends HttpServlet {
    17     @Override
    18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19         //请求乱码处理
    20         req.setCharacterEncoding("utf-8");
    21         //响应乱码处理
    22         resp.setContentType("text/html;charset=UTF-8");
    23         //操作cookie
    24 
    25         //增加
    26         Cookie cookie1 = new Cookie("name1","wuji1");
    27         resp.addCookie(cookie1);
    28         Cookie cookie2 = new Cookie("name2","wuji2");
    29         resp.addCookie(cookie2);
    30         //删除
    31        /* 6):Cookie的生命周期:(Cookie中的共享数据可以保留多久)
    32                 缺省情况:关闭浏览器Cookie就丢失了.
    33                 通过Cookie对象的setMaxAge(int seconds):设置Cookie可以存活多久.
    34                 seconds>0:可以存活多少秒.
    35                 seconds<0:存放在浏览器进程中,闭浏览器Cookie就丢失了.
    36                 seconds=0:删除Cookie.
    37         7):删除Cookie:
    38         Cookie对象.setMaxAge(0);*/
    39         cookie1.setMaxAge(0);
    40         //必须  resp.addCookie(cookie); 才可以生效
    41         resp.addCookie(cookie1);
    42         //修改
    43 
    44         //查询
    45 
    46         //获取输出对象
    47         PrintWriter writer = resp.getWriter();
    48         //输出信息
    49         writer.println("你好师姐!");
    50 
    51 
    52     }
    53 }
    CookieServlet
     1 package com.day07.web.demo2.controller;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.Cookie;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 import java.io.IOException;
    10 import java.io.PrintWriter;
    11 
    12 /**
    13  * Created by Administrator on 2017/12/7.
    14  */
    15 @WebServlet("/cookie2")
    16 public class Cookie2Servlet extends HttpServlet {
    17     @Override
    18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    19         //请求乱码处理
    20         req.setCharacterEncoding("utf-8");
    21         //响应乱码处理
    22         resp.setContentType("text/html;charset=UTF-8");
    23         //操作cookie
    24 
    25         //删除
    26         //修改
    27          
    28         //查询
    29         Cookie[] cookies = req.getCookies();
    30         for (int i=0;i<cookies.length;i++){
    31             Cookie cookie = cookies[i];
    32             //取key
    33             String name = cookie.getName();
    34             //取值
    35             String value = cookie.getValue();
    36             //打印
    37             System.out.println(name+"="+value);
    38 
    39             cookie.setValue("zhaoming");
    40             resp.addCookie(cookie);
    41         }
    42 
    43         //获取输出对象
    44         PrintWriter writer = resp.getWriter();
    45         //输出信息
    46         writer.println("你好师姐----获取cookie的数据!");
    47 
    48 
    49     }
    50 }
    Cookie2Servlet

    33.session简单使用

      Session的操作:
    1):获取Session对象/创建Session对象.
       HttpSession  session = request对象.getSession();等同于getSession(true);
       HttpSession  session = request对象.getSession(true);:如果当前有Session对象,就直接返回,若没有,则先创建一个再返回.
       HttpSession  session = request对象.getSession(false);:如果当前有Session对象,就直接返回,若没有,则返回null.

    2):把共享数据存储在Session中.
       Session对象.setAttribute(String name,Object value);
       session.setAttribute("currentName","Helloword");

    3):从Session中获取共享数据:
       Object  val = session.getAttribute("currentName");

    4):修改Session中的共享数据.
       重新设置一个同名的属性名
       session.setAttribute("currentName","世界你好!");

    5):删除Session中的共享数据.从Session中删除指定名的属性值.
       session.removeAttribute( "cuurentName");
    6):Session的规范命名:
        1):一般,根据我们队大师的研究,发现session中的属性名,习惯起名为:XXX_IN_SESSION.
        2):把登陆信息封装在一个对象中,再存储到Session中.
        LoginUser user  = new LoginUser("无忌",.....);
        session.setAttribute("USER_IN_SESSION",user);
        
         
    7):销毁Session对象(注销登录):
        session.removeAttribute("USER_IN_SESSION")方法,只能删除Session中指定名称的属性.
        session.invalidate():销毁整个Session对象.

    8):Session的超时管理.
       session.setMaxInactiveInterval(int seconds);
       session.setMaxInactiveInterval(15);若上一次操作之后,15内不再次和该网页交互,则Session会被自动销毁.
                                          两次操作的间隔时间不能超过15秒,若超过自动销毁Session.
       一般的,不需要我们去设置,在Tomcat中,默认的超时时间为30分钟(一般在20分钟就被销毁了).
      

      代码:

     1 package com.day07.web.demo2.controller;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.ServletRequest;
     5 import javax.servlet.ServletResponse;
     6 import javax.servlet.annotation.WebServlet;
     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 import java.io.IOException;
    12 import java.io.PrintWriter;
    13 
    14 /**
    15  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    16  * 疑问咨询wx:851298348
    17  */
    18 @WebServlet("/session")
    19 public class SessionServlet extends HttpServlet {
    20     @Override
    21     public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    22         //session   存放数据    位置:服务器   作用范围:整个浏览器
    23        //命名规范 一般,根据我们队大师的研究,发现session中的属性名,习惯起名为:XXX_IN_SESSION.
    24         //怎么存
    25              //先获得session对象
    26         HttpSession session = req.getSession();
    27         session.setAttribute("NAME_IN_SESSION","wuji");
    28         //怎么取
    29         String name =(String) session.getAttribute("NAME_IN_SESSION");
    30         System.out.println("-------name-----"+name);
    31         //怎么修改
    32         session.setAttribute("NAME_IN_SESSION","wuji2");
    33         //怎么删除
    34         session.removeAttribute("NAME_IN_SESSION");
    35        //向页面输出
    36         PrintWriter writer = res.getWriter();
    37         writer.print("================"+name);
    38     }
    39 }
    SessionServlet
     1 package com.day07.web.demo2.controller;
     2 
     3 import javax.servlet.ServletException;
     4 import javax.servlet.annotation.WebServlet;
     5 import javax.servlet.http.HttpServlet;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 import javax.servlet.http.HttpSession;
     9 import java.io.IOException;
    10 import java.io.PrintWriter;
    11 
    12 /**
    13  * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
    14  * 疑问咨询wx:851298348
    15  */
    16 @WebServlet("/session2")
    17 public class Session2Servlet extends HttpServlet {
    18     @Override
    19     public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    20         //session   存放数据    位置:服务器
    21         //怎么存
    22              //先获得session对象
    23         HttpSession session = req.getSession();
    24 
    25         //怎么取
    26         String name =(String) session.getAttribute("name");
    27         System.out.println("-------name-----"+name);
    28         //怎么修改
    29 
    30         //怎么删除
    31 
    32        //向页面输出
    33         PrintWriter writer = res.getWriter();
    34         writer.print("================"+name);
    35     }
    36 }
    Session2Servlet
  • 相关阅读:
    hihocoder 1038
    hihocoder 1039
    poj 2774
    bzoj 4690&&4602
    poj 2417
    STL
    poj 1026
    poj 1064
    poj 1861(prim)
    poj 1129
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8986475.html
Copyright © 2020-2023  润新知