Session
session常用代码
HttpSession session = request.getSession();
session.setAttribute("username", username);
String username = (String) session.getAttribute("username");
request.getSession().invalidate();
request.getSession() API执行流程
1.首先第一次访问当前页面,碰到request.getSession()经历了哪些事情呢?第一次访问当前应用,肯定不会有JSESSIONID的cookie请求头,所以此时肯定会创建一个新的session对象,session对象的id值通过Set-Cookie:JSESSIONID=xxx传输给客户端,客户端拿到这个cookie之后,保存下来
2.第二次再次访问当前页面时,再次遇到request.getSession(),发现请求头中有一个有效的JSESSIONID,那么服务器会再应用内去遍历,找到对应JSESSIONID的session对象,然后将这个session对象的引用传递过来。
假如还是之前的客户端,如果把JSESSIONID给丢了,那么再次去访问,还会给它返回原先的session对象吗?
客户端和服务器之间全凭JSESSIONID来沟通。来确定身份。
关闭浏览器Session对象会销毁吗
不会。类似于一种不可达的状态
关闭浏览器,重新打开,发现session中的数据访问不到了,原因?
作业:怎么样才能使得关闭浏览器之后还可以访问到之前的数据
关闭服务器Session对象会销毁吗
会。Session里面的数据会不会丢失?不会。
当关闭应用之前,会把session的id以及session里面的数据全部序列化到本地硬盘上
再次启动应用时,会读取该序列化文件重新到内存中,读取里面的id值以及对应的数据,会创建新的session对象,然后将这些id以及对应的数据注入到这个新创建的session对象中。
大家再验证的时候,不要通过重新Redeploy或者重启IDEA的tomcat来验证,得不到正确的结果,原因在于IDEA再每次启动的时候都会删除当前目录下的文件,然后重新复制tomcat的配置文件,重新开启一个新的tomcat,SESSION.ser文件并不是被读取到了内存中,而是整个目录被删了,但是这个时IDEA的问题,和我们Session知识点没有任何关系。
还有一种方式,你可以将IDEA里面部署的这个应用用本地tomcat来部署。
配置tomcat应用管理系统
/manager/html。前提条件时tomcat的webapps目录下的manager应用不能删除。
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
再tomcat-users节点下新增如下节点
重启IDEA的tomcat即可。
Session域
Context域、Session域、Request域
Context (和用户无关的,比如说商城的商品分类) > Session(存储用户特有的一些数据) > Request
一个应用中有且只有一个Context对象
一个客户端一般就对应着一个Session对象,当一个客户端访问多个servlet时,返回给它的永远都是同一个session对象。
Session的生命周期
session的创建:
request.getSession()
session对象存取数据:
setAttribute、getAttribute、removeAttribute
session的销毁:
对象的销毁:应用被卸载、服务器关闭
但是对象的销毁并不会导致数据的丢失,数据只有再以下情况下才会真正的丢失:
1.session有一个有效期,默认有效期是30min,如果再这段时间内无人访问,session的数据就会丢失了
2.主动调用session.invalidate()
关闭浏览器,再次打开可以访问到之前的数据
需要把id存储起来,设置时间
注销流程
package com.cskaoyan.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("/login2")
public class LoginServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
HttpSession session = request.getSession();
session.setAttribute("username", username);
response.getWriter().println("登录成功,即将跳转至个人主页....");
response.setHeader("refresh", "2;url=" + request.getContextPath() + "/info2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
package com.cskaoyan.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("/info2")
public class InfoServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
//session.invalidate();
System.out.println(session);
System.out.println(session.getId());
String username = (String) session.getAttribute("username");
response.getWriter().println("<div><span>欢迎您 " + username + "</span>");
response.getWriter().println("<a href='" +request.getContextPath() + "/logout" + "'>点我注销</a></div>");
}
}
package com.cskaoyan.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 java.io.IOException;
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这部分代码自己没有想到如何实现
request.getSession().invalidate();
response.getWriter().println("注销成功,即将跳转至登录页面....");
response.setHeader("refresh", "2;url=" + request.getContextPath() + "/login.html");
}
}