session介绍
先前的博客中已经介绍了Cookie会话技术,在本文章中将介绍总结Session技术。
Session技术是以Cookie技术为基础的,这也是这篇文章的标题,只要理解了它们之间的联系和区别,你就对B/S通信能有个大致的了解。
和Cookie相比 session 是一种更安全的存储对象。Cookie的信息存储于客户端,用户可以随时查看和修改,而Session信息存储于服务器,用户不可见。
Cookie可见
session不可见
session工作原理
session是基于Cookie实现的。
当用户第一次访问服务器时,服务器会创建一个Session 同时也会创建一个Cookie 记录下用户的信息,值得关注的是Cooike的JSESSION的值正是Session 的id值,这是文章标题的由来,随后将新创建的包含当前用户信息的Session存储到服务器内存中。服务器响应时将带有session id值的Cookie返回给客户端。
当用户再次访问服务器时,就会携带着含有Session id 值的Cookie,通过在服务器获取到Session得id 值,然后拿着这个id去服务器内存遍历Session对象,找到对应id的用户Session信息。服务器就知道你是上一次访问过我的用户。
session技术是基于Cookie实现的。
那么假如我们将已经返回给客户端的Cookie数组全清空,那么也就不存在能够依靠Cookie中的id值,找到用户Session信息。事实证明这是正确的,即使是Session还在生命周期之内。
实现流程分析
初次访问,会创建一个新的session,并且也创建了一个Cookie,返回给客户端,并且此时的Cookie的JSESSION属性值是Session的id(图片右下脚)
再次访问,请求头中携带着包含session id 的Cookie
删除所有Cookie后再去访问
1.Cookie已删除
2.再次访问
虽然Cookie已经被全部删除,id属性也没有了,就查不到Session,就会创建一个新的session(此时CookieJSEEION属性值依旧和Seesion 的id相等)
//创建或获取Session对象
//对上面的代码进行解释:当服务器内存中不存在请求对象的Session时,就会主动给请求对象创建一个Session;当服务器内存中存在时,就得到请求对象对应的Session -
session.isNew()//判断当前的session对象是否是新创建的
-
session.getId()//获取当前session的ID
//对上面的代码进行解释:每个session在被创建时,服务器都会给它分配一个唯一的ID值,用于标识当前用户 -
session.setAttribute()//以键值对的形式对session信息进行存储
-
session.getAttribute(String key)//有写就有读,以键值对的形式对session信息进行读取
-
session.getMaxInactiveInterval()//设置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;
/**
* @ProjectName session会话技术
* @ClassName sessionServlet
* @Description //
* @Email 2992794262@qq.com
* @Author ASUS
* @Date 2021/11/20
**/
@WebServlet(name = "SessionServlet",urlPatterns ="/sessionServlet" )
public class SessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//创建session,和获取session
HttpSession session = req.getSession();
//判断 session是否首次创建
boolean isNew = session.isNew();
//获取session的id唯一标识
String id = session.getId();
resp.getWriter().write("session唯一的id值是" + id+"</br>");
resp.getWriter().write("session是否是第一次创建" + isNew+"</br>");
//设置session的key和value
session.setAttribute("key1","value1");
resp.getWriter().write("已经往session域保存了信息"+"</br>");
//获取session的value值
Object value = session.getAttribute("key1");
resp.getWriter().write("key1的值是"+value+"</br>");
//TODO session的生命周期
//获取session的超时时长
int timeOut = session.getMaxInactiveInterval();
resp.getWriter().write("session的最大超时时长是" + timeOut+"</br>");
//设置session的超时时长为5秒
session.setMaxInactiveInterval(5);
timeOut = session.getMaxInactiveInterval();
resp.getWriter().write("修改后session的最大超时时长是" + timeOut+"</br>");
//让session已经设置为超时,被销毁
//session.invalidate();
// resp.getWriter().write("session已经被设置了超时");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
}