Session详解

Session概念:

服务器会给每一个用户 创建一个Session对象
一个Session独占一个浏览器 只要浏览器不关闭 这个Session就一直存在
一个网站登录后 该网站的子页面可以直接访问 并且子页面中会保存用户的信息

Session和Cookie的区别

Cookie是把用户的数据写给用户的浏览器
在用户的浏览器保存(可以保存多个)

Session是把用户的信息写到用户独占的session域中
服务器端保存(存重要信息,避免服务器端资源浪费)
Session由服务器端创建

Cookie中setAttribute( String name, String value) 只能存入String类型
Session中setAttribute( String name, Object value) 可以存入 Object类型

Session使用场景

保存用户登录信息
比如 B站 我们登录之后 每次进入无需重新登录

Cookie流程

Cookie把资源存在本地 每次由用户向服务器端发送
在这里插入图片描述

Session流程

Session把资源存在服务器端 只给了用户身份铭牌 根据这张铭牌 获取资源
在这里插入图片描述

练习Demo

该类常用方法

在这里插入图片描述
创建Servlet类

public class Session extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        PrintWriter out = resp.getWriter();
        HttpSession session = req.getSession();
        if(session.isNew()){
            out.write("新创建的Session id为:"+session.getId());
        }else{
            out.write("之前的Session id为:"+session.getId());
        }
        session.setAttribute("name","潮汕奴仔");


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在web.xml注册此servlet

<!--    注册servlet-->
    <servlet>
        <servlet-name>Session</servlet-name>
        <servlet-class>com.csnz.servlet.Session</servlet-class>
    </servlet>
    <!--    配置servlet的映射-->
    <servlet-mapping>
        <servlet-name>Session</servlet-name>
        <url-pattern>/setSession</url-pattern>
    </servlet-mapping>

启动服务器 访问
在这里插入图片描述
新建Servlet——GetSession类

public class GetSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        PrintWriter out = resp.getWriter();
        HttpSession session = req.getSession();
        String name = (String) session.getAttribute("name");
        out.write(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册Servlet

<!--    注册servlet-->
    <servlet>
        <servlet-name>GetSession</servlet-name>
        <servlet-class>com.csnz.servlet.GetSession</servlet-class>
    </servlet>
    <!--    配置servlet的映射-->
    <servlet-mapping>
        <servlet-name>GetSession</servlet-name>
        <url-pattern>/GetSession</url-pattern>
    </servlet-mapping>

启动服务器 先访问GetSession
因为没有set直接get 服务器会报500 显示空指针异常
在这里插入图片描述
先访问set
在这里插入图片描述
再访问get
在这里插入图片描述
手动写 注销Session类

public class SessionOut 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);
    }
}

注册Servlet

<!--    注册servlet-->
    <servlet>
        <servlet-name>SessionOut</servlet-name>
        <servlet-class>com.csnz.servlet.SessionOut</servlet-class>
    </servlet>
    <!--    配置servlet的映射-->
    <servlet-mapping>
        <servlet-name>SessionOut</servlet-name>
        <url-pattern>/SessionOut</url-pattern>
    </servlet-mapping>

访问此注销页面
在这里插入图片描述
进行get
在这里插入图片描述
同样 我们可以使用在web.xml中配置Session失效的时间来控制Session的作用域

<!--    设置Session有效时间-->
    <session-config>
<!--        默认1分钟后失效 这里是以分钟为单位-->
        <session-timeout>1</session-timeout>
    </session-config>

启动服务器访问set
在这里插入图片描述
在这里插入图片描述
一分钟后刷新get页面
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值