Ssession中文经常翻译为“会话”,Session跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
Session技术是服务端的解决方案,它是通过服务器来保持状态的。
我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session,也就是会话。具体一点,就是程序需要为每个客户端的请求创建一个session,客户端访问时,服务器首先检查这个客户端的请求里是否已包含了一个已经标识过的session id,如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个session),当然,如果用户在一段时间内没有访问服务器,那么Session会自动失效。我们就把这种基于唯一ID识别用户(客户端)身份的机制称为Session(会话)。
Session对应的类为javax.servlet.http.HttpSession类;Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。一般来说,session对象使用Cookie进行会话追踪。
首先,需要通过request请求的getSession()方法获取Session会话。也可以通过getId()来获取sessionid
Servlet中必须使用request来编程手动获取HttpSession对象,而JSP中内置了Session隐藏对象,可以直接使用。
@WebServlet("/one.do") //设置访问路径
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = request.getSession(); //获取session会话的对象
System.out.println(session.getId()); //获取sessionid
}
}
服务器通过一个名为JSESSIONID 的Cookie 来识别session,如果是第一次访问,服务器会创建session,根据这个新的Session_ID,创建一个名为"JSESSIONID"的Cookie,将Session_ID存入Cookie。
这个过程,在我们获取session对象时,也可以通过访问客户端的浏览器的开发者工具里可以观察其过程。在请求Session前,我们在请求头里是找不到cookie对应的sessionId的,当然肯定也找不到"JSESSIONID"

但在请求session对像后,我们就可以在cookie里找到我们存入的"JSESSIONID";

观察也可以发现,和我们控制台上获取打印输出的sessionid的值是一样的。

在之后的访问里,我们在请求头里也会看到存入的cookie:
下面使用不同的ip地址访问举例:

当然,也和控制台打印出来的一致

用一个图来辅助理解

Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。
Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。而每个客户端都会有一个独立的Session。如果当大量客户访问服务器时可能会导致内存溢出。因此,session在一定时间或条件下,也会被销毁。Session生成后,只要用户继续访问,服务器就会更新Session的最后那一次的访问时间,并维护该Session。所以在用户第一次访问session后,用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session更新”活跃“了一次。
**注意:Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session**,只访问HTML等静态页面时并不会创建Session
当有大量用户访问服务器时,Session也会越来越多。为了防止内存溢出,服务器会把长时间内没有活跃过也就是没有访问过服务器的Session从内存删除。如果超过了 session的超时时间 没访问过服务器,Session就自动失效了。例如,Tomcat中Session的默认超时时间为30分钟,30分种内没有访问服务器,session就会自动失效。
当然啦!我们也可以人为的控制session的超时时间或是否销毁:
setMaxInactiveInterval(longinterval)修改。setAttribute(String attribute, Object value);将指定Key-Value键值对,存入当前Session会话中。value参数可以为任何Java Object。getAttribute(String attribute);按照指定的Key从当前Session会话中获取Value,返回值为Object类型的对象,如果不存在,则返回null。removeAttribute(String name);按照指定的Key从当前Session会话中删除Key-Value键值对。etLastAccessedTime():获取当前Session会话最后一次请求的访问时间。getId();获取当前Session会话的SESSION ID,返回值为String。setMaxInactiveInterval(int second);设置Session的超时时间。单位为秒。etMaxInactiveInterval();返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效invalidate();使该Session失效