会话管理cookie_Session_三大对象域

目录

一、为什么使用会话

二、cookie

1.概述

2.使用

(1) servletA向响应中增加Cookie

(2)浏览器访问ServletA响应回来的响应报文携带cookie 

(3)浏览器访问ServletB,将携带cookie的请求报文发送给ServletB接收 

3.设置cookie的时效 

(1)会话级和持久级cookie

(2)设置时效

4.设置cookie的提交路径

(1)为什么要设置?

(2)如何设置

三、Session 

1.HttpSession概述

2.HttpSession使用

 3.HttpSession时效性

 四、三大域对象

1.概述

 2.三大域对象的数据作用范围图解

请求域

会话域

应用域

所有域在一起  

3.域对象的使用

(1)域对象的API

(2)使用

4.应用场景


一、为什么使用会话

会话就是记录客户端的历史行为,浏览器发送请求,服务器接收并响应,但是服务器不记录请求是否来自哪个浏览器,服务器没记录浏览器的特征,就是客户端的状态

比如,多个用户点击超链接通过一个 servlet 各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点结帐 servlet 时,结帐 servlet 可以得到用户各自购买的商品为用户结帐。

  1. 用户体验:会话管理可以确保用户在访问应用时拥有连贯和无缝的体验。通过会话,可以跟踪用户的状态、偏好设置和历史记录,使得用户无需重复输入信息。

  2. 状态保持:在Web应用中,由于HTTP协议是无状态的,会话管理使得服务器能够维持用户的状态信息。例如,用户登录后,系统需要记住用户的身份,以便在后续请求中识别该用户。

  3. 安全性:会话管理能够帮助保护用户信息和防止未授权访问。通过管理会话ID和使用加密技术,可以降低会话劫持和其他安全风险。

  4. 数据一致性:在某些应用中,用户可能需要在多个步骤中输入数据。会话管理可以确保这些数据在多个请求之间保持一致,避免数据丢失。

  5. 个性化:通过会话管理,应用可以根据用户的历史行为和偏好提供定制化服务,提升用户满意度和忠诚度。

  6. 资源管理:会话管理可以帮助服务器有效管理资源,例如限制同时在线的用户数量或设置会话的过期时间,确保系统的性能和可用性。

保存会话数据的技术

1.cookie

cookie是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息

2.session 

session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息

3.cookie和session配合记录请求状态

二、cookie

1.概述

服务端创建cookie,将cookie放入响应对象中,Tomcat容器将cookie转化为set-cookie响应头,响应给客户端

客户端在收到cookie的响应头时,在下次请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookie

cookie是一种键值对格式的数据,从tomcat8.5开始可以保存中文,但是不推荐

由于cookie是存储于客户端的数据,比较容易暴露,一般不存储一些敏感或者影响安全的数据

应用场景 

  1. 记录用户名

    当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.

  2. 保存电影播放进度

    在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到cookie中

2.使用

(1) servletA向响应中增加Cookie

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie1 =new Cookie("c1","c1_message");
        Cookie cookie2 =new Cookie("c2","c2_message");
        // 将cookie放入响应对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

(2)浏览器访问ServletA响应回来的响应报文携带cookie 

(3)浏览器访问ServletB,将携带cookie的请求报文发送给ServletB接收 

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求中的cookie
        Cookie[] cookies = req.getCookies();
        //迭代cookies数组
        if (null != cookies && cookies.length!= 0) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            }
        }
    }
}

3.设置cookie的时效 

(1)会话级和持久级cookie

会话级Cookie

  • 服务器端并没有明确指定Cookie的存在时间

  • 在浏览器端,Cookie数据存在于内存中

  • 只要浏览器还开着,Cookie数据就一直都在

  • 浏览器关闭,内存中的Cookie数据就会被释放

持久化Cookie

  • 服务器端明确设置了Cookie的存在时间

  • 在浏览器端,Cookie数据会被保存到硬盘上

  • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响

  • 持久化Cookie到达了预设的时间会被释放

(2)设置时效

使用cookie对象的API

cookie.setMaxAge(int expiry)参数单位是秒,表示cookie的持久化时间,如果设置参数为0,表示将浏览器中保存的该cookie删除  

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie1 =new Cookie("c1","c1_message");
        cookie1.setMaxAge(60);
        Cookie cookie2 =new Cookie("c2","c2_message");
        // 将cookie放入响应对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

4.设置cookie的提交路径

(1)为什么要设置?

通过cookie对象的API可以设置cookie的提交路径,如果没有设置,浏览器就把cookie放到请求报文直接发给下一个访问路径

访问互联网资源时不能每次都需要把所有Cookie带上。访问不同的资源时,可以携带不同的cookie,我们可以通过cookie的setPath(String path) 对cookie的路径进行设置

(2)如何设置

public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie1 =new Cookie("c1","c1_message");
        // 设置cookie1的提交路径
        // 浏览器只有访问servletB,请求报文才有cookie1
        cookie1.setPath("/web03_war_exploded/servletB");
        Cookie cookie2 =new Cookie("c2","c2_message");
        // 将cookie放入响应对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

三、Session 

1.HttpSession概述

HttpSession是一种保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间,即session对象. 客户端在发送请求时,都可以使用自己的session. 这样服务端就可以通过session来记录某个客户端的状态了

原理

  • 服务端在为客户端创建session时,会同时将session对象的id,即JSESSIONID以cookie的形式放入响应对象

  • 后端创建完session后,客户端会收到一个特殊的cookie,叫做JSESSIONID

  • 客户端下一次请求时携带JSESSIONID,后端收到后,根据JSESSIONID找到对应的session对象

  • 通过该机制,服务端通过session就可以存储一些专门针对某个客户端的信息了

  • session也是域对象(后续详细讲解)

原理图 

应用场景 

  1. 记录用户的登录状态

    用户登录后,将用户的账号等敏感信息存入session

  2. 记录用户操作的历史

    例如记录用户的访问痕迹,用户的购物车信息等临时性的信息

2.HttpSession使用

定义ServletA,将用户名存入session  

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求中的参数
        String username = req.getParameter("username");
        // 获取session对象
        HttpSession session = req.getSession();
         // 获取Session的ID
        String jSessionId = session.getId();
        System.out.println(jSessionId);
        // 判断session是不是新创建的session
        boolean isNew = session.isNew();
        System.out.println(isNew);
        // 向session对象中存入数据
        session.setAttribute("username",username);

    }
}

响应中收到了一个JSESSIONID的cookie  

定义其他Servlet,从session中读取用户名  

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();
         // 获取Session的ID
        String jSessionId = session.getId();
        System.out.println(jSessionId);
        // 判断session是不是新创建的session
        boolean isNew = session.isNew();
        System.out.println(isNew);
        // 从session中取出数据
        String username = (String)session.getAttribute("username");
        System.out.println(username);
    }
}

请求中携带了一个JSESSIONID的cookie  

 getSession方法的处理逻辑

当开启另外一个浏览器访问ServletA和ServletB, JSESSIONID和前面的浏览器的不一样,客户端不一样,线程不一样,会开启两个Session

 3.HttpSession时效性

为什么要设置session的时效?

  • 用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。

  • 客户端关闭行为无法被服务端直接侦测,或者客户端较长时间不操作也经常出现,类似这些的情况,就需要对session的时限进行设置了

默认的session最大闲置时间(两次使用同一个session中的间隔时间) 在tomcat/conf/web.xml配置为30分钟

我们可以自己在当前项目的web.xml对最大闲置时间进行重新设定

也可以通过HttpSession的API 对最大闲置时间进行设定

// 设置最大闲置时间
session.setMaxInactiveInterval(60);

也可以直接让session失效

// 直接让session失效
session.invalidate();

 四、三大域对象

1.概述

域对象: 一些用于存储数据和传递数据的对象,传递数据不同的范围,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同

  • web项目中,我们一定要熟练使用的域对象分别是 请求域,会话域,应用域

  • 请求域对象是HttpServletRequest ,传递数据的范围是一次请求之内及请求转发

  • 会话域对象是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求

  • 应用域对象是ServletContext,传递数据的范围是本应用之内,可以跨多个会话

 2.三大域对象的数据作用范围图解

请求域

会话域

应用域

所有域在一起  

3.域对象的使用

(1)域对象的API

API功能
void setAttribute(String name,String value)向域对象中添加/修改数据
Object getAttribute(String name);从域对象中获取数据
removeAttribute(String name);移除域对象中的数据

(2)使用

ServletA向三大域中放入数据  

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 向请求域中放入数据
        req.setAttribute("request","request-message");
        //req.getRequestDispatcher("servletB").forward(req,resp);
        // 向会话域中放入数据
        HttpSession session = req.getSession();
        session.setAttribute("session","session-message");
        // 向应用域中放入数据
        ServletContext application = getServletContext();
        application.setAttribute("application","application-message");

    }
}

ServletB从三大于中取出数据  

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从请求域中获取数据
        String reqMessage =(String)req.getAttribute("request");
        System.out.println(reqMessage);
        
        // 从会话域中获取数据
        HttpSession session = req.getSession();
        String sessionMessage =(String)session.getAttribute("session");
        System.out.println(sessionMessage);
        // 从应用域中获取数据
        ServletContext application = getServletContext();
        String applicationMessage =(String)application.getAttribute("application");
        System.out.println(applicationMessage);
    }
}

请求域<会话域<应用域

ServletA请求转发给ServletB,ServletB能从请求域获得数据,换成响应重定向就不行。

ServletA向会话域存数据,如果换一个浏览器访问同一个web项目,是获取不到会话域的数据的。

应用域不同就是web项目不同。

4.应用场景

  • 请求转发时,请求域可以传递数据请求域内一般放本次请求业务有关的数据,如:查询到的所有的部门信息

  • 同一个会话内,不用请求转发,会话域可以传递数据会话域内一般放本次会话的客户端状态有关的数据,如:当前客户端登录的用户

  • 同一个APP内,不同的客户端,应用域可以传递数据应用域内一般放本程序应用有关的数据 如:Spring框架的IOC容器

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值