Javaweb学习笔记之Session

package com.demo.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/*
Session 技术:

    1、引入:
        Cookie 的局限:
            1)、Cookie 只能存字符串,不能存对象;
            2)、Cookie 不能存中文数据;
            3)、一个 cookie 的数据不能超过 4KB;
        如果要存储超过 4KB的数据,或者存储中文数据,或者存储对象数据,就只能用 session 技术;
        Session 的特点:会话数据保存在服务器端(内存中);

    2、Session 技术的核心:HttpSession类,通过此类对会话数据进行存储;
        1)、创建或的到 session 对象:通过请求对象 request 得到 session 对象;
            HttpSession request.getSession();               // 得到或创建对象
            HttpSession request.getSession(boolean create); // 如果参数为true,和无参的 getSession() 一样,得到或创建对象;
                                                            // 如果参数为false,只能用来得到session对象,如果没有匹配的session编号,则返回null;
        2)、设置 session 对象:
            void setMaxInactiveInterval(int interval);      // 设置 session 的有效时间
            void invalidate();                              // 销毁 session 对象
            String getId();                                 // 得到 session 编号
        3)、存取会话数据
            void setAttribute(String name, Object value);   // 保存数据
            Object getAttribute(String name);               // 获取数据
            void removeAttribute(String name);              // 清除数据

    3、Session 的原理:
        HttpSession session = request.getSession():创建(获取) session 对象解析:
        1)、浏览器第一次访问服务器时,request.getSession() 方法会创建 session 对象,并给 session 对象
            分配一个唯一的 ID,叫做 JSESSIONID;服务器端把 JSESSIONID 作为 cookie 的值发送给浏览器端保存;
        2)、第二次访问的时候,浏览器带着 JSESSIONID 的 cookie 访问服务器,服务器得到 JSESSIONID,在服务器
            的内存中搜索是否存在对应编号的 session 对象;如果找到对应编号的 session 对象,request.getSession()
            方法直接返回该对象;如果找不到对应编号的 session 对象,则创建新的 session 对象,继续走 1) 的流程;
 */

@WebServlet(name = "SessionDemo1", value = "/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    /*
    保存会话数据到 session 域对象;
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 1、创建(获取) session 对象
        HttpSession session = request.getSession();

        // 得到 session 编号:JSESSIONID 的值
        String id = session.getId();
        System.out.println("JSESSIONID:" + id);

        // 设置 session 的有效时间
        // 关闭浏览器时,session 对象依然存在,因为 session 对象是在服务器中的;
        // 默认情况下,session 对象的存在时间为 30分钟,30分钟后服务器自动回收;
//        session.setMaxInactiveInterval(20); // 设置 session 的有效时间为 20秒,20秒后服务器自动回收 session 对象;

        /*
        还可以在 web.xml 中设置 session 对象的全局有效时间,对服务器中的所有 session 对象都有效;
        <session-config>
            <session-timeout>5</session-timeout> // 注意:此处设置时间以 分钟 为单位,此设置为 5分钟;
        </session-config>
        */

        // 默认情况下,发送到浏览器的 JSESSIONID 是会话级别的,浏览器关闭,则 JSESSIONID 消失;
        // 为了使浏览器关闭以后 JSESSIONID 还继续存在,我们可以手动设置 JSESSIONID 的有效时间;
        Cookie cookie = new Cookie("JSESSIONID", session.getId()); // JSESSIONID 的值就是 session 的编号
        cookie.setMaxAge(60 * 5);   // 设置 JSESSIONID 的有效时间为 5分钟
        response.addCookie(cookie);

        // 2、保存会话数据到 session 对象
        session.setAttribute("name", "rose");
        System.out.println("保存数据成功");
    }
}
package com.demo.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "SessionDemo2", value = "/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
    /*
    从 session 域对象中取出会话数据
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 1、创建(获取) session 对象
        HttpSession session = request.getSession();

        // 得到 session 编号:JSESSIONID 的值(必须和保存数据的 JSESSIONID 的值一样才能取出数据)
        String id = session.getId();
        System.out.println("JSESSIONID:" + id);

        // 2、从 session 对象中取出数据
        String name = (String)session.getAttribute("name");
        System.out.println("name=" + name);
    }
}
package com.demo.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "DeleteSession", value = "/DeleteSession")
public class DeleteSession extends HttpServlet {
    /*
    手动销毁 session 对象
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 1、得到 session 对象
        HttpSession session = request.getSession(false);
        if (session == null){
            System.out.println("session 对象不存在");
            return ;
        }

        // 销毁 session 对象
        session.invalidate();
        System.out.println("session销毁成功");
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值