zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8986475.html
Copyright © 2011-2022 走看看