会话及会话技术

  1. 使用request域对象保存商品信息:
    • 结论:使用request保存商品信息不可以,因为每次发送请求,都会产生一个新的请求对象
  2. 使用ServletContext域对象保存商品信息:
    • 结论:使用ServletContext域对象保存商品信息,可以,但是不合理。多个客户共用一个ServletContext对象,最后结算时会把前面的不是自己购买的商品都结算了。

所以在开发中,采用Cookie和Session来保存会话保存会话中产生的数据

Cookie

存在客户端

  1. 什么是Cookie?

    • Cookie是一种会话管理技术,它是用来保存会话过程中产生的数据,然后再浏览器和服务器交互时,会使用Cookie里面保存的数据。
  2. Cookie的执行原理

    image-20210512111534505

  3. Cookie常用的API

    • 获得Cookie对象:Cookie cookie = new Cookie(String name, String value);

    • 回写(响应)cookie到浏览器端:response.addCookie(cookie);

    • 得到cookie的名称:String key = cookie.getName();

      得到cookie的值:String value = cookie.getValue();

    • 给cookie设置生命时长:setMaxAge(int s);

      比如:cookie.setMaxAge(60*60*24)//说明cookie有效时间为1天

      cookie分类:

      ​ 第一类:会话级别cookie,浏览器关闭,cookie对象就销毁

      ​ 第二类:持久化cookie,通过setMaxAge这个方法来设置

    • 给cookie设置路径:设置域名:

      setPath(路径url);setDomain(域名);

    • 得到cookie:Cookie[] cookies = request.getCookies();

案例:通过Cookie实现记录用户的上次访问时间

package top.lukeewin.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.text.SimpleDateFormat;
import java.util.Date;

//@WebServlet(name = "LastAccessServlet")
public class LastAccessServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理中文乱码问题
        response.setContentType("text/html;charset=utf-8");

        String lastAccessTime = null;
        //获取所有Cookie,放到数组中
        Cookie[] cookies = request.getCookies();
        //遍历数组
        for (int i = 0; cookies !=null && i < cookies.length; i++) { //cookies !=null 注意判断是否为空
            //判断cookie的名字是否是lastAccessTime
            String name = cookies[i].getName();
            if ("lastAccessTime".equals(name)) {
                lastAccessTime = cookies[i].getValue(); //获取cookie的值
                break; //如果找到了,就立刻结束
            }
        }
        //判断是否是第一次访问
        if (lastAccessTime == null) {//第一次访问
            response.getWriter().print("你是首次访问本网站!");
        }else {//不是第一次访问
            response.getWriter().print("你上次访问本网站的时间是:" + lastAccessTime);
        }
        //获取每次访问的时间
        String currentTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(new Date());
        //把currentTime作为cookie的值存到cookie中
        Cookie cookie = new Cookie("lastAccessTime", currentTime);
        //设置cookie保存时间
        cookie.setMaxAge(60*60*24); //单位为秒
        //把cookie响应到客户端浏览器中
        response.addCookie(cookie);
    }

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

Session

  1. 什么是Session?

    Session是一种会话管理技术,Session用来保存会话过程中的数据,保存的数据存储到服务器端。

    Session原理:基于Cookie实现的,更确切的说是基于会话级别的Cookie实现的

  2. HttpSession API

    session常用方法:

    • 得到session的id(JESSIONID对应的值):getId();

    • 设置session的生命时长:setMaxInactiveInterval(int interval);

    • 销毁session:invalidate();

      得到session:HttpSession session = getSession();

  3. session域对象:作用范围一次完整的会话(包含多个请求)

    • 存值:setAttribute(String key, Object obj);
    • 取值:Object obj = getAttribute(String key);
    • 移除:removeAttribute(String key);

    总结域对象:request域对象 session域对象 servletContext域对象,作用范围依次变大。

    request域对象:作用范围一次请求,通常和转发操作配合使用

    session域对象:作用范围一次会话,通常和重定向操作配合使用

    servletContext域对象:作用范围整个项目,和重定向,转发操作都可以配合使用

  4. Session超时管理

    Session对象默认存活时间是30分钟

    可以配置web.xml

    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>
    

    立即销毁session对象:invalidate();

Q.E.D.


热爱生活,热爱程序