A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 旧里桃花七年醉 初级黑马   /  2019-5-9 13:54  /  676 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

## Cookie&Session

#### 1. 能够说出会话的概念

- 什么是会话?

  > 一次会话中可以发送多次请求和响应

- 一次会话:当浏览器第一次打开后与服务器建立连接,一次会话即建立,当某一端关闭会话即结束

#### 2. 能够说出两种会话技术(Cookie和Session)的区别

- 客户端技术:cookie   存在客户端
- 服务器端技术:session   存在服务器端

#### 3. 能够创建、发送、接收、删除cookie

- 创建:Cookie c  = new Cookie("name","value");
- 发送: response.addCookie(c)
- 接收:Cookie[]   request.getCookies()
- 删除:c.setMaxAge(0)

#### 4. 能够说出cookie执行的原理

> cookie执行的底层也是基于http协议的,通过抓包分析发现:第一次请求服务器的时候,服务器端会创建cookie并且将cookie发送回浏览器端(通过设置了响应头:set-cookie:msg=hello),浏览器端发现响应头中有set-cookie头后,则将cookie的信息保存在本地,下次再请求的时候,则会自动帮我们把已有的cookie信息携带上发送给服务器(通过请求头:cookie:msg=hello),服务器则可以通过获取cookie的方式取出cookie的信息

#### 5. 能够获取session对象、添加、删除、获取session中的数据

- 获取session对象:request.getSession
- 添加(存值):session.setAttribute("key",Object value)
- 删除:removeAttribute("key")
- 获取:getAttribute(“key”)

#### 6. 能够说出session执行的原理

> 浏览器第一次建立会话请求服务器,服务器端会调用request.getSession这行代码---在内存中开辟了一块内存空间存放session,session.setAttribute()就可以存值了,并且在创建完session空间的同时为该空间生成了一把钥匙,该钥匙其实就是一个cookie:JESSIONID=12323432894;返回该cookie到浏览器,浏览器接收到cookie存放在自己的内存中,同时下次请求的时候携带该cookie,当服务器接收到有JESSIONID的cookie时,取出value值来判断是否与我们内存中的session的钥匙相匹配,如果匹配才能取值或存值

#### 7. 能够说出session的创建、销毁时机

- 销毁
  - 会话关闭
  - invalide() 自杀
  - 默认30分钟到了就失效



session的销毁:

1. 浏览器关闭: 浏览器端的cookie那把钥匙就没了
   - 在浏览器关闭后session依旧能生效,其实可以让钥匙 (cookie)持久化
2. 服务器端关闭



- 域对象
  - ServletContext:整个web应用
  - Session:一次会话
  - request:一次请求--请求转发的时候







#### 今日任务

1. 说出或写出 cookie执行的原理

2. 完成显示上次访问时间的案例

   - cookie实现

   - 步骤:

     - 编写代码:

       - 1. 在Servlet中获取cookie : Cookie[]   request.getCookies()

         2. 遍历cookies,判断是否有 叫  lastTime的cookie

         3. 如果没有:代表第一次访问

            1. 创建cookie :Cookie c  = new Cookie("lastTime",获取当前的系统时间);
            2. 发送回去:response.addCookie(c)
            3. response.getWriter().write("您好,欢迎首次访问")

         4. 如果有:代表不是第一次访问

            1. 把这个cookie的值获取出来   c.getValue()

            2. response.getWriter().write("您好,欢迎回来,您上次的访问时间:"+value)

            3. 获取当前的时间,并且调用c.setValue("时间")

            4. 发送回去:response.addCookie(c)

               

   ```java
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //设置响应的消息体的数据格式以及编码
           response.setContentType("text/html;charset=utf-8");
   
           //1.获取所有Cookie
           Cookie[] cookies = request.getCookies();
           boolean flag = false;//没有cookie为lastTime
           //2.遍历cookie数组
           if(cookies != null && cookies.length > 0){
               for (Cookie cookie : cookies) {
                   //3.获取cookie的名称
                   String name = cookie.getName();
                   //4.判断名称是否是:lastTime
                   if("lastTime".equals(name)){
                       //有该Cookie,不是第一次访问
   
                       flag = true;//有lastTime的cookie
   
                       //响应数据
                       //获取Cookie的value,时间
                       String value = cookie.getValue();
                       System.out.println("解码前:"+value);
                       //URL解码:
                       value = URLDecoder.decode(value,"utf-8");
                       System.out.println("解码后:"+value);
                       response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
   
                       setCookieTime(response, cookie);
   
                       break;
   
                   }
               }
           }
   
   
           if(cookies == null || cookies.length == 0 || flag == false){
               //没有,第一次访问
   
               Cookie cookie = new Cookie("lastTime",null);
              setCookieTime(response,cookie);
               response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
           }
   
       }
   
       /**
        * 获取当前时间,并且设置cookie返回给浏览器
        * @param response  :响应对象
        * @param cookie    :返回的cookie
        * @throws UnsupportedEncodingException
        */
       private void setCookieTime(HttpServletResponse response, Cookie cookie) throws UnsupportedEncodingException {
           //设置Cookie的value
           //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
           Date date  = new Date();
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
           String str_date = sdf.format(date);
           System.out.println("编码前:"+str_date);
           //URL编码
           str_date = URLEncoder.encode(str_date,"utf-8");
           System.out.println("编码后:"+str_date);
           cookie.setValue(str_date);
           //设置cookie的存活时间
           cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
           response.addCookie(cookie);
       }
   ```

3. 理解jsp的脚本

   ```java
   <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
   <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。相当于Out.print  注意不要写分号
   
   <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。不建议使用!
   
   
   ```

   小细节:

   ```
   a)out真实对象是JspWriter ,response获得Writer是PrintWriter.
   b)out输出会把内容放到out缓冲区(JspWriter缓冲区),response输出会把内容放到response缓冲区(PrintWriter缓冲区).
   c)out缓冲区不能直接向页面输出,把内容先放到response缓冲区里面,通过response缓冲区才能向页面输出
   
   ```

   - 在使用jsp的时候尽量使用  <%=  输出内容 %> 本质上就是out对象的输出

4. 说出或写出 session的原理

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马