关于session的一点小疑问。

关于session的一点小疑问。

package listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class WebListener implements ServletContextListener,HttpSessionListener,ServletRequestListener{

  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    // TODO Auto-generated method stub
    System.out.println("ServletContext 已销毁");
  }

  @Override
  public void contextInitialized(ServletContextEvent sce) {
    // TODO Auto-generated method stub
    System.out.println("ServletContext 已初始化");
  }

  @Override
  public void sessionCreated(HttpSessionEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println("Session已创建,ID: "+  arg0.getSession().getId());
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println("Session已销毁");
  }

  @Override
  public void requestDestroyed(ServletRequestEvent sre) {
    // TODO Auto-generated method stub
    System.out.println("HttpServeltRequest 已销毁");
  }

  @Override
  public void requestInitialized(ServletRequestEvent sre) {
    HttpServletRequest req = (HttpServletRequest)sre.getServletRequest();
    // TODO Auto-generated method stub
    System.out.println("HttpServeltRequest 已创建 uri:  " + req.getRequestURI());
  }
  
  

}
package listener;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().println("hello world<br>" );
		request.getServletContext().setAttribute("context", "contextatt");
		request.getSession().setAttribute("session", "sessionatt");
		request.setAttribute("request", "requestatt");
		response.getWriter().println(request.getSession().getId());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>listener-interface</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <listener>
    <listener-class>listener.WebListener</listener-class>
  </listener>
</web-app>
  1. 问下是不是如果不在servlet里面进行session的创建,默认是不会建立session这个东西的? 

  2. 为什么我即使重启了服务器,然后同一个网页浏览器不关闭直接刷新,也不会再次触发Session创建,并且在servlet页面还是会打印出和上次一样的session id? 也就是说服务器直接认可了存储在cookie里面的session id么? 这个是为什么? 

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿园 2020-07-20 10:12:31

同学你好

1,这个问答老师解释的是HttpSessionListener无效,并不是写上这句话,服务器访问时才会创建session,而是写上这句会触发session对象内容添加的监听

2,Tomcat下发布的web应用程序,如果涉及session的操作,在Tomcat关闭的时候,将会在work 目录下相应的路径下创建 SESSION.ser 文件存储该webapp的 session 数据。在 session有效时间内重启Tomcat 或re-deploy,将会加载该文件中的数据,恢复用户原来的 session运行环境。

祝学习愉快

  • 提问者 慕前端8369922 #1
    谢谢老师解答疑问
    2020-07-21 06:52:22
  • rock221 #2

    老师,如果发送了一次请求,那么服务器会开辟一块空间作为sessionId,然后再响应回去(前提是进行setAttribute设置吧?如果不进行set设置, 那么不会进行响应处理吧?本次请求也不会被销毁吧?),当session进行响应回去的时候, 是根据response的代码吧,如果不写这个代码,只写了setAttribute,session的实现原理还会自定响应给浏览器吗?

    2021-03-25 22:29:09
  • 同学你好,1、setAttribute方法,是将某个变量或者对象通过request.setAttribute()方法放入到request对象的作用域中。

        ​2、而request的请求转发与response的响应重定向

    请求转发:

    http://img1.sycdn.imooc.com//climg/605d471c09eb74fd07500041.jpg

    响应重定向

    http://img1.sycdn.imooc.com//climg/605d473b098f128607260053.jpg

    如上所示是对应路径的跳转,与是否设置了setAttribute方法存入数据,并没有直接关系,也就是说,无论是否存入数据,对应的路径跳转都会执行。

    反之,如果不写请求转发或响应重定向对应的路径跳转,那这个请求就不能正确执行完成。

    祝学习愉快!

    2021-03-26 10:34:44
好帮手慕阿园 2020-07-19 15:54:00

1,并不是哦,默认情况下,用户首次访问服务器的一个页面时,服务器就会为该用户分配一个session对象,同时为这个session指定唯一的id,并且将该id发送到客户端并写入到cookie中

2,session id是存在cookie中的,浏览器不关闭cookie没有失效,session id也没有失效,所以再次访问页面时,服务器根据session id找到对应的session。所以输出的session id没有变

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~


  • 提问者 慕前端8369922 #1
    1。老师你好,关于第一题,我是看了这位同学的问题。 https://class.imooc.com/course/qadetail/238018 那里老师回答说首先要对session对象创建才会触发监听 我试验了一下: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().println("hello world<br>" ); } 如果在这里只这么写,其他的都和上面一样的话是不会触发seesion创建提示的,按f12cookie里面本来显示session值的地方也没有东西了? 所以这是为什么呢? 2. 这里也有点疑惑,我没有关闭浏览器,但是我重启了服务器,所以再次访问页面的时候,服务器应该已经被清空了的,是如何根据session id找到对应的session呢? 请老师解惑,谢谢了
    2020-07-20 02:08:57
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师