JavaWeb的Cookie、Session

Cookie、Session

1 会话

会话:用户打开浏览器,点击了很多链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话

有状态会话

一个网站,证明证明你来过?

客户端 服务端

  1. 服务端给客户端一个信件,服务端下次访问服务端带上信件就可以了;cookie
  2. 服务器登记你来过了,下次你来的时候我来匹配你

2 保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中!
  1. 从请求中拿到cookie信息
  2. 服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//获得cookie cookie.getName();//获得Cookie的key cookie.getValue();//获得Cookie的Value new Cookie(lastLoginTime, String.valueOf(System.currentTimeMillis()));//新建一个cookie cookie.setMaxAge(24*60*60); //设置cookie有效期为一天 resp.addCookie(cookie);//响应设置的cookie到浏览器 

cookie:一般会保存在本地用户appdata目录下

一个网站cookie是否存在上限?

  • 一个Cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • Cookie大小有限制4kb
  • 300个cookie浏览器上限

删除Cookie

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期时间为0

传递中文cookie

//编码 Cookie cookie = new Cookie(name,URLEncoder.encoded(测试,utf-8)); //解码 out.write(URLDecoder.decode(cookie.getValue,UTF-8)); 

测试:

package com.servlet;  import jakarta.servlet.ServletException; import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Date;  //保存用户上一次访问的时间 public class CookieDemo01 extends HttpServlet {     @Override     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         //服务器告诉你,你来的时间把这个时间封装成一个信件,你下带来,我就知道你来了          //解决中文乱码         resp.setContentType(text/html;charset=UTF-8);         resp.setCharacterEncoding(utf-8);         PrintWriter out = resp.getWriter();         //Cookie,服务器端从客户端获取         Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个          //判断cookie是否存在          if(cookies!=null){             //如果存在怎么办             out.write(你上一次访问的时间是);             for (int i = 0; i < cookies.length; i++) {                 Cookie cookie = cookies[i];                 //获取cookie的名字                if(cookie.getName().equals(lastLoginTime)){                    long lastLoginTime = Long.parseLong(cookie.getValue());                    Date date = new Date(lastLoginTime);                    out.write(date.toLocaleString());                }             }         }else {             out.write(这是你第一次访问本站);         }          //服务器给客户端响应一个cookie         Cookie cookie = new Cookie(lastLoginTime, String.valueOf(System.currentTimeMillis()));         //设置cookie有效期为一天         cookie.setMaxAge(24*60*60);         resp.addCookie(cookie);     };      @Override     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         doGet(req,resp);     } } 

image

4 Session(重点)

什么是Session:

  • 服务器会给每个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
  • 用户登录之后,整个网站它都没有访问-->保存用户的信息

Session和Cookie的区别:

  • Cookie是把用户的数据写入给用户的浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占的Session中,服务端保存(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务创建

使用场景

  • 保存一个登陆用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的的数据,我们将他保存在Session中

常用方法

方法名 功能描述
getId() 获取SessionID
isNew() Session是否是新的(如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同,则认为这个HttpSession对象不是新建的)
setMaxInactiveInterval() 设置Session的最大时效
getMaxInactiveInterval() 获取Session的最大时效
getCreationTime() 获取Session的创建时间
getLastAccessedTime() 获取Session的最后访问时间
invalidate() 销毁Session对象
setAttribute() 设置数据,将数据保存在Session这个域对象中
getAttribute() 获取数据,将保存在Session这个域对象中的数据获取出来

使用

  1. 创建测试类Person
package com.Pojo;  public class Person {     private String name;     private int age;      public Person(String name, int age) {         this.name = name;         this.age = age;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getAge() {         return age;     }      public void setAge(int age) {         this.age = age;     }      @Override     public String toString() {         return Pojo.Person{ +                 name=' + name + '\'' +                 , age= + age +                 '}';     } } 
  1. 创建测试Session类
package com.servlet; import com.Pojo.*; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession;  import java.io.IOException;  public class SessionDemo01 extends HttpServlet {     @Override     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         //解决乱码问题         resp.setContentType(text/html;charset=UTF-8);         resp.setCharacterEncoding(utf-8);          //得到Session         HttpSession session = req.getSession();         //给Seesion中存东西         session.setAttribute(name, new Person(测试,1));         //获取Session的ID         String sessionId = session.getId();          //判断Session是不是新创建的         if (session.isNew()) {             resp.getWriter().write(session创建成功:+sessionId);         }else {              resp.getWriter().write(session已创建的ID:+sessionId);         }         Person person= (Person) session.getAttribute(name);          resp.getWriter().write(</br>);         resp.getWriter().write(String.valueOf(person));     }      @Override     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req,resp);     } }  

image

  1. 新页面引用Session类
package com.servlet;  import com.Pojo.Person; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession;  import java.io.IOException;  public class SessionDemo02 extends HttpServlet {     @Override     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         //解决乱码问题         resp.setContentType(text/html;charset=UTF-8);         resp.setCharacterEncoding(utf-8);          //得到Session         HttpSession session = req.getSession();          Person person = (Person) session.getAttribute(name);          System.out.println(person);     }      @Override     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         doGet(req,resp);     } } 
  1. 注销Session年

    1. 手动注销
    package com.servlet;  import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession;  import java.io.IOException;  public class SessionDemo03 extends HttpServlet{     @Override     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         HttpSession session = req.getSession();         session.removeAttribute(name);         //手动注销         session.invalidate();     }      @Override     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         doGet(req, resp);     } } 
    1. 自动注销

    web.xml中写入

    <!--    设置session默认的失效时间-->     <session-config> <!--        十五分钟自动注销-->         <session-timeout>15</session-timeout>     </session-config>