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里面的数据会不会丢失?不会。

image

当关闭应用之前,会把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存储起来,设置时间
image

注销流程

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");

    }
}
posted @ 2022-07-30 15:48  拿受用  阅读(190)  评论(0编辑  收藏  举报