2020年Cookie&Session课堂笔记

Cookie&Session

会话技术

会话:一次会话中包含多次请求和响应

  • 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止

功能:

  1. 客户端会话技术:Cookie
  2. 服务器端会话技术:Session

Cookie

  1. 概念:客户端会话技术,将数据保存到客户端

  2. 使用步骤:

    1. 创建Cookie对象,绑定数据 new Cookie(String name,String value)
    2. 发送Cookie对象 response.addCookie(Cookie cookie)
    3. 获取Cookie对象数组,拿到数据 Cookie[] request.getCookies()
  3. 常用方法

    方法声明 功能描述
    String getName() 获取Cookie对象的name
    String getValue() 获取Cookie对象的value
    void setName(String name) 设置Cookie对象的name
    void setValue(String value) 设置Cookie对象的value
  4. 注意细节:

    1. 一次可以发送多个Cookie对象
      • 创建多个Cookie对象,使用response调用多次addCookie方法发送Cookie对象即可
    2. Cookie对象默认情况下保存时间为浏览器关闭前
    3. Cookie对象持久化存储:setMaxAge(int seconds)
      • seconds 是正数:将Cookie信息存储到硬盘,存活seconds,时间到后,自动删除Cookie文件
      • seconds 是负数:默认值
      • seconds 是零:删除Cookie信息
    4. Cookie能不能存中文?
      • 在Tomcat 8 之前 Cookie不能直接存储中文数据。(需要URL编码)
      • 在Tomcat 8之后 Cookie支持中文数据,但不支持特殊字符。(建议URL编码)
  5. Cookie的共享问题

    1. 同一Tomcat服务器中的Cookie共享问题?

      • 多个web项目之间的Cookie数据默认不能共享
      • setPath(String path):设置Cookie的获取范围。默认设置为当前的虚拟目录,如果要共享,将 path 设置为/
    2. 不同Tomcat服务器中的Cookie共享问题?

      • setDomain(String path):如果设置一级域名相同,那么多个服务器之间的Cookie可以共享
        • 例子:setDomain(".baidu.com"),那么tieba.baidu.comnews.baidu.comCookie可以共享
    3. Cookie特点

      1. Cookie存储数据在客户端浏览器
      2. 单个Cookie大小有限制(4kb),同一域名下的总Cookie数量有限制(20个)
    4. Cookie的作用

      1. Cookie一般用于存储少量的不太敏感的数据
      2. 在不登录的情况下,完成服务器对客户端的身份识别

案例:记住上一次访问时间

需求:

  1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
  2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串

Cookie实例代码:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的消息体的数据格式以及编码
        response.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = request.getCookies();
        boolean flag = false;
        //已经访问过
        if(cookies!=null && cookies.length>0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                //判断名称是否是:lastTime
                if("lastTime".equals(name)){
                    flag = true;
                    //设置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(30);
                    response.addCookie(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>");
                    break;
                }

            }
        }
        //第一次访问
        if(cookies == null || cookies.length == 0|| flag == false){
            //设置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 cookie = new Cookie("lastTime", str_date);
            //设置cookie的存活时间
            cookie.setMaxAge(30);
            response.addCookie(cookie);

            response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

JSP

  1. 概念:java Servlet Pages:java服务器端页面,本质上是一个Servlet
  • JSP页面中可以同时有HTML标签java代码,用于简化书写
  1. 使用方式:

    方式 功能描述
    <% java代码 %> Java代码等效于在Service方法中执行
    <%! java代码 %> java代码
    <%= java代码 %> java代码会直接输出到页面上
  2. JSP的内置对象:

    • 在jsp页面中的对象不需要获取和创建,可以直接使用

    • jsp一共有9个内置对象。

      • request

      • response

      • out:字符输出流对象。可以将数据输出到页面上。

        out.write()response.getwriter()区别:

        • response.getWriter()数据输出永远在out.write()在前

Session

  1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession

  2. 使用步骤:

    1. 获取HttpSession对象:

      • HttpSession session = request.getSession();
    2. 使用HttpSession对象:

      方法声明 功能描述
      Object getAttribute(String name)
      void setAttribute(String name,Object value)
      void removeAttribute(String name)
  3. 注意细节:

    1. 客户端关闭后,服务器不关闭,两次获取的session是否为同一个

      • 默认情况下不是同一个

      • 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让Cookie持久化保存。

        Cookie c = new Cookie("JSESSIONID",session.getID());
        c.setMaxAge(60*60);
        response.addCookie(C);
        
    2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

      • 不是同一个,但是要确保数据不丢失。Tomcat自动完成以下工作
        • session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
        • session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。
    3. session什么时候被销毁?

      1. 服务器关闭

      2. session对象调用invalicate()

      3. session默认失效时间30分钟

        <!-- 选择性配置修改 -->
        <session-config>
            <session-timeout>30</session-timeout>
        </session-config>
        
  4. session的特点

    1. session用于存储一次会话的多次请求的数据,存储服务器端

    2. session可以存储任意类型,任意大小的数据

      sessionCookie区别

      • session存储数据在服务器端,Cookie在客户端
      • session没有数据大小限制,Cookie有限制
      • session数据安全,Cookie相对不安全
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章