【JavaWeb】Servlet的应用全面讲解(三)cookie和session

HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。

一、Cookie

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)

(一)cookie的创建和发送

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //cookie的创建
        Cookie cookie = new Cookie("name","admin");
        //发送(响应) Cookie对象
        resp.addCookie(cookie);
    }

(二)cookie的获取

将会返回一个cookie数组,供获取cookie数据

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取cookie数组
        Cookie[] cookies = req.getCookies();
        //判断cookie是否为空
        if(cookies != null && cookies.length>0){
            //遍历cookie数组
            for (Cookie cookie : cookies){
                //获取cookue的名称和值
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println("名称:"+name+" 值:"+value);
            }
        }
    }

(三)cookie的到期时间

1. 到期时间的表示

/**
 * cookie的到期时间
 *      负整数
 *          默认值-1,表示只在浏览器内存中存活,关闭浏览器失效
 *      正整数
 *          表示存活时间,单位秒
 *      零
 *          删除cookie
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /*到期时间:负整数(默认值-1,表示只在浏览器内存中存活,关闭浏览器失效)*/

        Cookie cookie = new Cookie("uname1","zhangsan");
        cookie.setMaxAge(-1); //关闭浏览器失效
        resp.addCookie(cookie);

        /*到期时间:正整数(表示存活指定秒数,会将数据存在磁盘中)*/

        Cookie cookie2 = new Cookie("uname2","lisi");
        cookie.setMaxAge(30); //存活30s
        resp.addCookie(cookie2);

        /*到期时间:零 (表示删除cookie)*/

        Cookie cookie3 = new Cookie("uname3","wangwu");
        cookie.setMaxAge(0); //删除cookie
        resp.addCookie(cookie3);
    }

(四)cookie中文乱码问题、以及如何重新设置

1. 说明

/**
 * cookie的注意点
 *  1. Cookie只在当前浏览器有效(不跨浏览器和主机)
 *  2. Cookie不能存中文
 *      如果一定要存中文,则需要URLEncoder.encode()方法进行编码。获取时通过URLDecoder.decode()方法进行解码
 *
 *  3.如果出现同名的Cookie对象,则会覆盖
 *  4.Cookie的存储数量是有上限,不同浏览器不同。Cookie储存的大小也是有限的,大概4kb
 *
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*Cookie存中文*/
        String name = "姓名";
        String value = "张三";

        //将中文通过URLEncoder进行编码
        name = URLEncoder.encode(name);
        value = URLEncoder.encode(value);

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        //响应Cookie
        resp.addCookie(cookie);

        //获取Cookie时,通过URLDecoder进行解码
        Cookie[] cookies = req.getCookies();
        //判断非空
        if(cookies != null&& cookies.length>0){
            //遍历
            for(Cookie cook : cookies){
                //解码
                System.out.println(URLDecoder.decode(cook.getName()));
                System.out.println(URLDecoder.decode(cook.getValue()));
            }
        }

        //将原来已有的Cookie对象重新设置
        Cookie cookie2 = new Cookie("name","zhangsan");
        resp.addCookie(cookie2);

    }

(五)指定路径获取cookie

1. 说明

/**
 * cookie的路径
 *     1. 当前服务器下的任何项目的任意资源都可以获取Cookie对象
 *          设置路径为“/”,表示在当前服务器下任何项目都可访问到Cookie对象
 *     2. 当前项目下的资源都可以获取Cookie对象 (默认不设置Cookie的path)
 *          默认不设置Cookie的path 或者 设置为当前站点名
 *     3. 指定项目下的资源都可以获取Cookie对象
 *     4. 指定目录下的资源都可以获取Cookie对象
 *
 *     总结:只有访问的路径中包含Cookie对象的Path值,才有以获取到该cookie对象
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /*当前服务器下的任何项目的任意资源都可以获取Cookie对象*/
        Cookie cookie01 = new Cookie("cookie01","cookie01");
        //设置路径为“/”,表示在当前服务器下任何项目都可访问到Cookie对象
        cookie01.setPath("/");
        resp.addCookie(cookie01);

        /*当前项目下的资源都可以获取Cookie对象 (默认不设置Cookie的path)*/
        Cookie cookie02 = new Cookie("cookie02","cookie02");
        //默认不设置Cookie的path 或者 设置为当前站点名
        cookie01.setPath("/servlet");
        resp.addCookie(cookie02);

        /*指定项目下的资源都可以获取Cookie对象 */
        Cookie cookie03 = new Cookie("cookie03","cookie03");
        //设置为指定项目的站点名
        cookie01.setPath("/指定站点名");
        resp.addCookie(cookie03);

        /*指定目录下的资源都可以获取Cookie对象 */
        Cookie cookie04 = new Cookie("cookie04","cookie04");
        //设置为指定项目的站点名
        cookie01.setPath("/servlet/cookie04");
        resp.addCookie(cookie04);
    }

二、Session

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。

(一)session对象的获取和访问

1. 说明

/**
 * Session对象的获取
 *  session对象的获取
 *      req.getSession()
 *      当获取session对象时,会先判断session对象是否存在。若存在,则获取,反之,则创建。
 *  常用方法
 *      获取session的会话标识符     getId()
 *      获取session的创建时间       getCreationTime()
 *      获取最后一次访问时间         getLastAccessedTime()
 *      判断是否是新的session对象   isNew()
 */

2.代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();

        //获取session的会话标识符
        String id = session.getId();
        System.out.println(id);
        //获取session的创建时间
        System.out.println(session.getCreationTime());
        //获取最后一次访问时间
        System.out.println(session.getLastAccessedTime());
        //判断是否是新的session对象
        System.out.println(session.isNew());

    }

(二)session域对象的应用

1. 说明

/**
 * Session域对象
 *      setAttribute() 设置域对象
 *      getAttribute() 获取域对象
 *      removeAttribute() 移除域对象
 *
 *      请求转发
 *          一次请求
 *          request作用域有效
 *          session作用域有效
 *      重定向
 *      ·   两次请求
 *          request作用域无效
 *          session作用域有效
 */

2. 代码演示

重定向时,session域依旧能够共享

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();

        //设置域对象
        session.setAttribute("uname", "admin");
        session.setAttribute("upwd", "123456");

        //移除session域对象
        session.removeAttribute("upwd");

        /*request域对象*/
        req.setAttribute("name","zhangsan");

        //请求转发跳转到jsp页面
        //req.getRequestDispatcher("sessionTest.jsp").forward(req,resp);
        //重定向跳转到jsp页面
        resp.sendRedirect("sessionTest.jsp");

    }

jsp页面获取session域对象

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取域对象</title>
</head>
<body>
<%
  //获取session域对象
  String uname = (String) request.getSession().getAttribute("uname");
  String upwd = (String) request.getSession().getAttribute("upwd");

  //获取request域对象
  String name = (String) request.getAttribute("name");

  out.print("uname :"+ uname + ",upwd :"+ upwd +",name :" +name);
%>
</body>
</html>

session对象的过期和销毁

1. 说明

/**
 * Session对象的销毁
 *      1. 默认到期时间
 *          Tomcat 中的session默认存活时间为30min,即你无操作的时间。一旦有操作,session存活时间将重计
 *          可以在 Tomcat 中的 conf 目录下的 web.xml 文件中进行修改
 *
 *          <!-- session 默认的最大不存活时间。单位:分钟 -->
 *          <session-config>
 *              <session-timeout>30</session-timeout>
 *          </session-config>
 *
 *      2. 手动设置到期时间
 *          通过session.setMaxInactiveInterval(int)来设定session的最大不活动时间,单位为秒
 *          并且可以通过getMaxInactiveInterval()方法来查看当前Session对象的最大不活动时间
 *
 *      3. 立即销毁
 *          通过session.invalidate()方法
 *
 *      4.关闭浏览器
 *          session底层依赖cookie,cookie对象默认只在浏览器内存中存活,关闭浏览器即失效
 *
 *      5.关闭服务器
 *          关闭服务器,session销毁
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();

        //设置域对象
        session.setAttribute("uname", "admin");

        /*//Session 对象的最大不活动时间
        System.out.println("当前Session对象的最大不活动时间:"+session.getMaxInactiveInterval());

        //修改Session 对象的最大不活动时间为15秒
        session.setMaxInactiveInterval(15);*/

        //立即销毁
        session.invalidate();
    }

End

简单理解cookie和session和cookie就是一个字典,只是一个储存在服务器、一个存储在客户端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaWeb中的CookieSession是用于在服务器和客户端之存储和传递数据的机制。 Cookie是在客户端(浏览器)保存少量数据的文本文件,它由服务器发送给浏览器,并在浏览器下一次向同一服务器发送请求时被浏览器携带过去。Cookie可以用于实现用户认证、记住登录状态、记录用户行为等功能。在JavaWeb中,可以使用`javax.servlet.http.Cookie`类来创建和设置CookieSession是在服务器端存储用户信息的一种机制。当用户第一次访问服务器时,服务器会为该用户创建一个唯一的会话标识(Session ID),并将该标识保存在Cookie中发送给客户端。客户端在后续的请求中会带上这个Session ID,服务器通过这个Session ID可以获取到对应的会话信息。在JavaWeb中,可以使用`javax.servlet.http.HttpSession`类来创建、获取和操作SessionCookieSession的区别主要有: 1. 存储位置:Cookie存储在客户端,Session存储在服务器端。 2. 容量限制:Cookie有大小限制,一般为4KB左右;Session可以存储较大量的数据。 3. 安全性:Cookie数据存储在客户端,容易被恶意篡改;Session数据存储在服务器端,相对较安全。 4. 生命周期:Cookie可以设置过期时间,可以长期保存在客户端;Session默认情况下会在一段时间内保持活跃,超过时间会被销毁。 在实际应用中,CookieSession常常结合使用,通过Cookie存储Session ID来实现用户的身份验证和状态管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peng_YuJun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值