前言
这一篇主要介绍了servlet中的session以及一个session的小案例。
一、Session的概念
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
下面画个图来看下session的工作原理:
所以对于session来说,不同的客户的数据,其实是通过一个key为JSSESIONID的cookie来区分的。
二、Session常用API
上图中我们已经看到了几个session相关的API,这里我们具体来说下用处:
- request.getSession() :得到HttpSession对象,在我们设置或者是获取session中的数据时,我们都需要先得到这个对象。
- session.setSession():设置session;比如,我们设置一个key为name的session,就可以这样写:session.setAttribute(“name”, “xxx”);
- session.getSession():拿到session的值,这个很好理解,传入key值,就可以获取对应的value值。
(这里需要说明的一点,session是一个域对象,可以被可以被多个请求共享,只要会话不断,就可以共享;
同样是域对象的还有之前博客里的request和servletContext,他们之前的作用域的大小是不一样的,request的作用域最小,只在一次请求内;session次之,只要是同一个用户且session没有过期,都可以访问到;servletContext最大,是在一整个应用内有效) - session.getId():获取session的id值,通过这个值,我们可以看到,不同的客户端去访问同一个地址,它的session是不同的。这里有一张图,分别用Chrome游览器的普通窗口和无痕窗口来模拟两个不同的用户,我们在servlet中输出session的id:
(忽视图片中其他的字,这是我们案例中的例子。这里我们只观察,不同客户端去访问同一个url,我拿到的id值是不同的,这也印证了session的工作原理,解释了它为什么能为不同的用户提供各自的资源了。) - setMaxInactiveInterval():session过期时间,以秒为单位
- session.incalidate():调用就强制销毁session
三、getSession的内部原理
上面讲解了API的作用,这里我们写个小演示代码:
//在demo1中,通过url传入的name,设置一个session
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
String name = req.getParameter("name");
HttpSession session = req.getSession();
session.setAttribute("name",name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}