Session的一些特点
1. 当客户端关闭时,在服务器关闭、前后,获取session是否为同一个?
1.1 默认情况下,不是同一个session。
①。在cn.itcast.session包下创建SessionDemo3文件
package cn.itcast.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;
@WebServlet("/SessionDemo3")
public class SessionDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取session
HttpSession session = request.getSession();
System.out.println(session);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
②。在浏览器地址栏中输入http://localhost:8080/CookieDemo01/SessionDemo3,idea控制台打印输出为一下结果:
③。当关闭浏览器后,在重新打开浏览器,再次访问http://localhost:8080/CookieDemo01/SessionDemo3,那么idea控制台输出的值就会和上次有所不同。
1.2 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
package cn.itcast.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/SessionDemo3")
public class SessionDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取session
HttpSession session = request.getSession();
System.out.println(session);
//期望客户端关闭后,session也能相同
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60 * 60);
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
在浏览器地址栏中输入http://localhost:8080/CookieDemo01/SessionDemo3,idea控制台打印输出的结果和当关闭浏览器后,在重新打开浏览器,再次访问,idea控制台输出的值和上次一样。
2. 客户端不关闭,在服务器关闭后,两次获取的session是同一个吗?
不是同一个
(1)Session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上。
(2)Session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。
2.1 tomcat自动的把session的钝化和活化做了。
①。将idea之前部署的文件,IdeaProjects->Cookie_demo01->out->artifacts->web_war_exploded,将web_war_exploded文件里面的内容打包为war包。
②。将war包直接粘贴到tomcat的webapps文件里面。
③。打开apache-tomcat-9.0.34\bin目录下的startup.bat开启本地tomcat服务器。此时再打开apache-tomcat-9.0.34\webapps,其文件里面已经部署完成。
在浏览器中访问http://localhost:8080/web/SessionDemo1,然后再访问http://localhost:8080/web/SessionDemo2,因此tomcat日志里面就会打印输出hello session
④。打开apache-tomcat-9.0.34\bin目录下的shutdown.bat关闭本地tomcat服务器。那么session被序列化的文件会放到apache-tomcat-9.0.34\work\Catalina\localhost\web文件里面。
⑤。再次在浏览器中访问,还是可以访问到hello session。
2.2 idea虽然能钝化,但是活化的操作不会成功。
①。启动服务器,我们可以在控制台找到配置的路径
②。在浏览器中访问http://localhost:8080/CookieDemo01/SessionDemo1,然后正常关闭掉服务器,那么C:\Users\user.IntelliJIdea2019.2\system\tomcat\Tomcat_9_0_34_Cookie_demo01\work\Catalina\localhost\CookieDemo01文件里面就会出现SESSIONS.ser文件
③。当再次用idea启动服务器的过程中,C:\Users\user.IntelliJIdea2019.2\system\tomcat\Tomcat_9_0_34_Cookie_demo01目录下的work文件会自动删除,然后自动创建。但是新创建的work目录没有对应的SESSIONS.ser文件,所以并获取不到session之前的数据
3. session什么时候被销毁?
- 服务器关闭。
- session对象调用invalidate()。
- session默认失效时间:30分钟。
可以在apache-tomcat-8.5.54\conf目录下找到web.xml文件。打开web.xml文件,找到session-config标签,这里指的是session的失效时间为30分钟,可以自己根据需要进行修改。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
4. session的特点
- session用于存储一次会话的多次请求,存在服务端。
- session可以存储任意类型,任意大小的数据。