Session详解

Session详解

一、什么是Session

  • Session是一个接口(HttpSession)
  • Session是一个会话,用来维护一个客户端和服务器之间关联的技术
  • 每个客户端都有自己的Session会话
  • 我们经常在Session中保存用户登录后的信息

那么,Session怎么创建和使用呢?请看下面:

二、Session的使用

后边所说的HttpSession是全文所说的Session的类,Session是一种习惯的叫法。

这里先新建一个session.html文件,以便后边演示使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Session学习实例</title>
    <base href="http://localhost:8080/Cookie/">
    <style type="text/css">
        iframe{
            position: absolute;
            left: 500px;
            top: 0px;
        }

        ul li{
            width: 300px;
            list-style: none;
        }
    </style>
</head>
<body>
    <div>
        <ul>
            <li><a href="" target="target">Session的创建和获取</a></li>
            <li><a href="" target="target">Session域数据的存储</a></li>
            <li><a href="" target="target">Session域数据的获取</a></li>
            <li>Session的存活</li>
            <li>
                <ul>
                    <li><a href="" target="target">Session的默认超时及配置</a></li>
                    <li><a href="" target="target">Session 3秒超时销毁</a></li>
                    <li><a href="" target="target">Session 马上销毁</a></li>
                </ul>
            </li>
            <li><a href="" target="target">浏览器和Session绑定的原理</a></li>
        </ul>
    </div>
    <iframe name="target" width="500" height="500"></iframe>
</body>
</html>

再写一个BaseServlet.java:

package com.hstc.edu;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决post请求中文乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html; charset=UTF-8");

        String action = req.getParameter("action");
        try {
            // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            // 调用目标业务方法
            method.invoke(this, req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.1 创建、获取Session

创建和获取都使用同一个API——request.getSession(),功能如下:

  • 当第一次调用该接口的时候,系统会创建一个Session会话
  • 之后调用则都是获取第一次创建好的Session会话对象

如果我们不知道这个Session是不是新的怎么办呢,可以调用HttpSession对象的方法isNew() 来判断。返回true表示第一次创建,返回false表示已创建,此时的HttpSession对象是调用第一次创建的HttpSession对象。

对于每一个Session,都会有一个唯一标记的id值,使用 getId() 方法即可获取。

直接来一波代码演示:

package com.hstc.edu;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionServlet extends BaseServlet{
    static int num = 1;

    protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //创建和获取Session对象
        HttpSession session = req.getSession();
        //判断是否是新创建的
        boolean isNew = session.isNew();
        //获取Session的id值
        String id = session.getId();
        resp.getWriter().write("第"+num+"次调用getSession获得的isNew的值为: "+isNew+"<br>");
        resp.getWriter().write("id值为:"+id+"<br>");
        num++;
    }
}

然后在web.xml下注册:

    <servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>com.hstc.edu.SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/session</url-pattern>
    </servlet-mapping>

然后在html中修改此a标签的href值

<li><a href="session?action=createOrGetSession" target="target">Session的创建和获取</a></li>

然后运行服务器,第一次点击显示:
在这里插入图片描述
之后点击结果显示:
在这里插入图片描述
可见,isNew值变为了false,且id值不变。

2.2 Session域数据的存和取

在SessionServlet类中添加方法:

    protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //存
        req.getSession().setAttribute("key1","value1");
        resp.getWriter().write("成功设置attribute");
    }

    protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //取
        Object attribute = request.getSession().getAttribute("key1");
        response.getWriter().write("从Session中获取得到的key1的值为: "+attribute);
    }

在html5中添加a标签的href路径:

 <li><a href="session?action=setAttribute" target="target">Session域数据的存储</a></li>
 <li><a href="session?action=getAttribute" target="target">Session域数据的获取</a></li>

比较简单,就不演示了。

2.3 Session生命周期控制

public void setMaxInactiveInterval(int interval) 设置Session的超时时间,超过指定时长,Session就会自动销毁。(interval以秒为单位,默认是1800,也就是30分钟)
**public void getMaxInactiveInterval()**获取Session的超时时间

如果想修改某个工程session的默认时长,可以在web.xml中添加以下标签:

    <session-config>
        <!--10表示10分钟-->
        <session-timeout>10</session-timeout>
    </session-config>

如果要用代码修改当然也行,请看:
在SessionServlet中添加方法:

    //获取默认的session时长
    protected void getDefaultLife(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        int time = session.getMaxInactiveInterval();
        response.getWriter().write("session的默认超时时长为:"+time);
    }

    //将session的存活时长改为3s
    protected void set3secondLife(HttpServletRequest request,HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(3);
        response.getWriter().write("当前Session的默认时长已经设置为3秒");
    }

    //设置session每次创建都立即销毁
    protected void set0secondLife(HttpServletRequest request, HttpServletResponse response) throws IOException{
        HttpSession session = request.getSession();
        //使用invalidate方法让session马上到时
        session.invalidate();
        response.getWriter().write("会话已删除");
    }

在html中设置这几个标签:

<li><a href="session?action=getDefaultLife" target="target">Session的默认超时及配置</a></li>
<li><a href="session?action=set3secondLife" target="target">Session 3秒超时销毁</a></li>
<li><a href="session?action=set0secondLife" target="target">Session 马上销毁</a></li>

之后重启服务器,自己操作一下就懂了。

知识点:
1、使用session.getMaxInactiveInterval()可以获取session的超时时间。
2、使用session.setMaxInactiveInterval(int num)可以设置session的超时时间(num表示秒)。
3、使用session.invalidate();可以立马销毁session。
4、使用session.setMaxInactiveInterval(int num)时,如果num < 0 那么,该session永久存活,不太常见,容易出问题。

三、浏览器和服务器的Session之间关联的底层技术

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值