Session会话讲解

Session会话

        servlet 容器使用HttpSession接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。服务器能够以多种方式维护会话,

  • 比如使用 cookie 或重写 URL。

  • 此接口允许 servlet

  • Session就是一个接口(HttpSession)

  • Session就是会话,它是用来维护一个客户端和服务器之间关联的一种技术

  • 每个客户端都有自己的一个Session会话

  • Session会话中,我们经常用来保存登录之后的信息

        查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问时间 将对象绑定到会话,允许跨多个用户连接保留用户信息 当应用程序将对象存储到会话中或从会话中移除对象时,该会话将检查对象是否实现了 HttpSessionBindingListener。如果实现了,则 servlet 将通知该对象它已经被绑定到会话,或者已从会话中取消对它的绑定。通知是在绑定方法完成后发送的。对于无效或过期的会话,通知是在会话已经无效或过期之后发送的。

        当容器使用分布式容器设置在 VM 之间迁移会话时,所有实现 HttpSessionActivationListener 接口的会话属性都会得到通知。

         servlet 应该能够处理客户端选择不加入会话的情况,比如故意关闭 cookie 时。在客户端加入会话前,isNew 一直返回 true。如果客户端选择不加入会话,则 getSession 将对每个请求返回一个不同的会话,并且 isNew 将总是返回 true。

         会话信息的范围仅限于当前 Web 应用程序 (ServletContext),因此存储在一个上下文中的信息在另一个上下文中不是直接可见的。

创建和获取Session(ID号、是否为新)

如何创建和获取Session,它们的API是一样的

  • request.getSession()
  • 第一次调用是:创建Session会话
  • 之后调用都是:获取前面创建好的Session会话对象
  • isNew():判断是不是新建的Session它是Boolean值
  • 每个会话都有一个身份证号,也就是ID值,而且这个ID值是唯一的
  • getId()得到Session的会话id值

在这里插入图片描述创建Session

public class CookieServlet implements HttpSession {

protected void createOrGetSession(HttpServletRequest req,HttpServletResponse resp) throws IOException {
    //创建和获取Session会话对象
    HttpSession session = req.getSession();
    //判断当前Session是不是新创建出来的
    boolean isNew = session.isNew();
    //获取Session会话的唯一标识
    String id = session.getId();
    resp.getWriter().write(id);
    resp.getWriter().write("这个Session是否是新创建的" + isNew);
}
}

Session数据域

public class CookieServlet implements HttpSession {
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        req.getSession().setAttribute("key1","value1");
        resp.getWriter().write("已经往Session保存了数据");
        Object attribute = req.getSession().getAttribute("key1");
        resp.getWriter().write("从Session取的数据为" + attribute);
}
}

Session默认的超时时间为30分钟在web.xml对Session的超时进行设置
方法: public void setMaxInactiveInterval(int interval)

  • 值为正数时,设定Session的超时时长
  • 负数表示永远不超时
<!--表示当前web工程,创建出来的所有Session默认是30分种超时时长-->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
/*设置单独的Session对象的超时时间*/
protected void life(HttpServletRequest req , HttpServletResponse resp) {
    //先获取Session对象
    HttpSession session = req.getSession();
    //设置当前Session  60秒后销毁需要客户端从新请求
    session.setMaxInactiveInterval(60);
}

还有一个方法:public void invalidate() 表示让当前Session会话马上超时无效

protected void deleteNow(HttpServletRequest req , HttpServletResponse resp) {
        //先获取Session对象
        HttpSession session = req.getSession();
        //设置当前Session马上销毁
        session.invalidate();
    }

以及其他的Session要实现的方法

 @Override
    public long getCreationTime() {
        return 0;
    }

    @Override
    public String getId() {
        return null;
    }

    @Override
    public long getLastAccessedTime() {
        return 0;
    }

    @Override
    public ServletContext getServletContext() {
        return null;
    }

    @Override
    public void setMaxInactiveInterval(int i) {

    }

    @Override
    public int getMaxInactiveInterval() {
        return 0;
    }

    @Override
    public HttpSessionContext getSessionContext() {
        return null;
    }

    @Override
    public Object getAttribute(String s) {
        return null;
    }

    @Override
    public Object getValue(String s) {
        return null;
    }

    @Override
    public Enumeration<String> getAttributeNames() {
        return null;
    }

    @Override
    public String[] getValueNames() {
        return new String[0];
    }

    @Override
    public void setAttribute(String s, Object o) {

    }

    @Override
    public void putValue(String s, Object o) {

    }

    @Override
    public void removeAttribute(String s) {

    }

    @Override
    public void removeValue(String s) {

    }

    @Override
    public void invalidate() {

    }

    @Override
    public boolean isNew() {
        return false;
    }

还有什么问题可以留言给我,会尽心解答的,觉得文章不错的话点个赞把

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员小徐同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值