session
session和cookie一样,也是用于保存客户会话状态的。但是cookie保存在浏览器缓存或者是客户端硬盘文件中,而session保存在服务器端。
session是一个接口。javax.servlet.http.HttpSession
如何获取session呢?
获取session
HttpServletRequest对象中有一个getSession的方法。
package com.dh.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class Session01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println(session);
}
}
配置web.xml
然后访问,刷新两次:
org.apache.catalina.session.StandardSessionFacade@6301e4c8
org.apache.catalina.session.StandardSessionFacade@6301e4c8
org.apache.catalina.session.StandardSessionFacade@6301e4c8
关闭浏览器,再次请求,并且刷新两次:
org.apache.catalina.session.StandardSessionFacade@66b6fea3
org.apache.catalina.session.StandardSessionFacade@66b6fea3
org.apache.catalina.session.StandardSessionFacade@66b6fea3
由结果可以得出,会话,目前可以理解为打开浏览器到关闭浏览器的过程。
但是,为什么当前会话中的每一次请求都可以拿到属于自己的会话对象?即在上述中,为什么在一次会话中每一次的请求得到的session对象是一样的?
session原理
在会话进行中,web服务器一直为当前的用户维护着一个会话对象,即在web容器中,web容器维护了大量的HttpSession对象,所以web容器中应该有一个session列表。
打开浏览器,在浏览器上首次发送请求
服务器会创建一个HttpSession对象,该代表一次会话;
同时还会生成HttpSession对象对应的cookie对象,并且该cookie对象的name一定是JSESSIONID,值是一个32位长度的字符串;
(通过JSESSIONID这个特殊的cookie名字来确定该cookie是不是来找session对象的)
web容器会将session对象和cookie对象的value绑定在session列表中(Map<cookie的value,session对象>;
服务器再将完整的cookie发送给浏览器客户端,保存再浏览器中的缓存中(只要浏览器不关闭,cookie就不生效);
当在该次会话中,再次发送请求,会自动提交缓存中的cookie;
服务器会根据携带的cookie的value去查找对应的session对象,返回该session对象。

(所以session对象其实是依赖cookie对象的,如果浏览器禁用了cookie,则浏览器中不再存在cookie,就会导致在同一个会话中无法获取到对应的session对象,每次获取的都是一个新的session对象。)
若还想保持一样,则必须在请求路径中添加上一次请求中的JESSIONID=32位长度的字符串。
浏览器关闭之后,服务器端的session对象会销毁吗?
不会。
因为http协议是无状态无连接的,为了降低服务器的压力,只有在浏览器请求服务器的瞬间,它们的通道会打开,请求响应结束之后,通道会关闭。直接关闭浏览器,服务器是不会知道的。
所以引入了session超时的概念:
在一定的时间内,如果没有用户访问该session对象,此时该session对象就是超时,服务器会自动的回收该session对象。
session对象有默认的超时时间:30分钟。
可以在web.xml中配置:
<session-config>
<!-- 单位为分钟 -->
<session-timeout>120</session-timeout>
</session-config>
所以准确的来说,一次会话不是浏览器打开到关闭,而是session创建到session销毁。
应用:网站的安全退出,会清除所有的信息,但是不点击安全退出,直接关闭浏览器,是不会清除所有的信息的。
session常用方法
session也是一个域对象。
之前也说过两个域对象:
-
HttpServletRequest:作用范围为一次请求(提醒:转发是一次请求的);可以跨servlet。
-
HttpSession:作用范围为一次会话;可以跨请求。
-
ServletContext:作用范围为webapp;可以跨用户。
使用原则:能满足需求的前提下由小到大。
所以session也有操作域对象数据的三个方法:
void setAttribute(String var1, Object var2);
Object getAttribute(String var1);
void removeAttribute(String var1);
还有一个销毁session的方法:
void invalidate();
也可以通过session对象获取ServletContext上下文对象:
ServletContext getServletContext();
session的使用很简单,但是最重要的是要理解session的原理。
使用也是获取session,首次将用户的信息保存至session,之后的操作中判断session中是否存在信息。

浙公网安备 33010602011771号