用Servlet学习Session(会话)

400 阅读2分钟

1、Session是什么?

Session是一个接口(HttpSession)

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

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

Session会话中,经常用来保存用户登录之后的信息(在服务器端保存)

2、创建Session和获取(id号,是否为新)

获取和创建Session的API是一样的

request.getSession()

第一次调用是创建Session会话

之后的调用都是获取之前创建好的Session对象

isNew():判断是不是刚创建出来的(新的)

true表示刚创建

false表示获取之前就创建出来了

每个会话都有一个id,这个id是唯一的

getId()可以得到Session对象的id值

html代码示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   <base href="http://localhost:8080/Cookie_Session/">
<title>Session</title>
<style type="text/css">

   ul li {
      list-style: none;
   }
   
</style>
</head>
<body>
   <iframe name="target" width="500" height="500" style="float: left;"></iframe>
   <div style="float: left;">
      <ul>
         <li><a href="sessionServlet?action=createOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</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">Session3秒超时销毁</a></li>
               <li><a href="" target="target">Session马上销毁</a></li>
            </ul>
         </li>
      </ul>
   </div>
</body>
</html>

web.xml文件记得配置一下

package com.eastwind.servlet;
​
/*
@author zhangJH
@create 2023-06-26-9:35
*/
​
​
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
​
public class SessionServlet extends BaseServlet {
​
    //    创建和获取Session
    protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        创建session对象
        HttpSession session = request.getSession();
//        判断session对象是否是新创建的
        boolean aNew = session.isNew();
//        获取session对象的id
        String id = session.getId();
        response.getWriter().write("创建的session对象为" + session + "<br/>");
        response.getWriter().write("session对象是否是新创建的" + aNew + "<br/>");
        response.getWriter().write("session对象的id" + id + "<br/>");
    }
}

在第一次点击时是true,后续都不会是新创建的了,后面的结果都是false

如果一直是false的,是因为cookie有缓存了,把cookie清一下就行了

3、Session域中的数据存取

与其他域中的方式是一样的

图片.png

图片.png

4、Session的生命周期

图片.png public void setMaxInactiveInterval(int interval) 设置Session的超时时长(以秒为单位),超过指定的时长,Session就会被销毁

public int getMaxInactiveInterval() 获取Session的超时时长

Session的默认超时时长为30分钟(1800秒)

图片.png

只需要在web.xml文件中修改

<session-config>
    单位是分钟
    <session-timeout>60</session-timeout>
</session-config>

如果想单独的设置超时时长,需要使用setMaxInactiveInterval()这个方法,以秒为单位使用

Session的超时概念图

图片.png

当你设置了session的超时时长后,又获取了Session对象,那么超时时长将会被重置

负数不做演示,这里输入0没有用,因为Session有一个单独的API是用来立刻删除

public void invalidate():让session立刻超时,等同于Cookie的数值0

图片.png

protected void deathLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    session.invalidate();   // 使会话立刻超时
}