服务器端会话技术——session

服务器端会话技术——session

什么是一次会话呢,在生活中一次会话就是一次聊天,那么在J2EE中的一次会话指的是什么呢?

简单的说,打开浏览器,访问服务器,直到浏览器关闭,称为一次会话,严格的说,一次会话应该是依赖session的生成机制,那么什么是Session的生成机制呢?

Session生成机制:

首先服务器必须调用request.getSession(),如果请求中没有带sessionId的cookie,则服务器一定会创建一个新的Session对象,如果请求中带了sessionID则服务器会根据传入的SessionId找到对应的session对象,如果session对象已经失效了,则会创建新的session对象,如果没有失效则会使用找到的session对象

需要注意的是当浏览器关闭,重启浏览器时,seesionId还是存在请求中的,但是由于关闭浏览器已经使存在内存中的cookie失效了,所以sessionID只是丢失了,而并没有失效

设置Session的空闲时间

Session.setMaxInactiveInterval(10);

空闲时间也就是说在规定时间内如果有重新访问则时间重置,如果没有访问那么SessionID就会失效

使session对象强制失效:

Session.invalidate();

1、概念:

服务器端 会话技术,在一次会话的多次请求间共享数据,将数据 保存 在服务器端的对象中。HttpSession

2、快速入门:

HttpSession对象:

Object getAttribute(String name)

void setAttribute(String name, Object value)

void removeValue(String name)

@WebServlet(name = "SessionDemo1", urlPatterns = {"/SessionDemo1"})
public class SessionDemo1 extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //使用session共享数据

      //1、获取session
      HttpSession session = request.getSession();
      //2、存储数据
      session.setAttribute("name","李逸");

      //3.1、转发方式
//       request.getRequestDispatcher("/SessionDemo2").forward(request,response);
      //3.2、重定向
      response.sendRedirect("/day18/SessionDemo2");
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      this.doPost(request, response);
  }
}
@WebServlet(name = "SessionDemo2", urlPatterns = {"/SessionDemo2"})
public class SessionDemo2 extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //使用session共享数据

      //1、获取session
      HttpSession session = request.getSession();
      //2、获取数据
      Object name = session.getAttribute("name");
      System.out.println("SessionDemo2:"+name);
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      this.doPost(request, response);
  }
}

3、原理

session的实现是依赖于cookie的。

4、细节:

1、当客户端关闭后,服务器不关闭,两次获取的session是否是同一个?

答:默认情况下,不是。

如果需要相同,则可以创建cookie,键为JSSIONIN,设置最大存活时间,让cookie持久化保存。

@WebServlet(name = "SessionDemo3", urlPatterns = {"/SessionDemo3"})
public class SessionDemo3 extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      HttpSession session = request.getSession();
      System.out.println(session);

      //期望客户端关闭后,session也可以相同
      Cookie cookie = new Cookie("JSESSIONID", session.getId());
      cookie.setMaxAge(60 * 60);
      response.addCookie(cookie);
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      this.doPost(request, response);
  }
}

2、客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

答:不是同一个,但是要确保数据不丢失。

session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上。

session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。

3、session的失效时间?

1、服务器关闭

2、Session.invalidate();使session对象强制失效

3、session默认失效时间:30分钟

选择性的配置修改

<session-config>
  <session-timeout>30</session-timeout>
</session-config>

5、session的特点:

1、session用于存储一次会话的多次请求的数据,存在服务器端。

2、session可以存储任意类型,任意大小的数据。

session与cookie的区别:

1、session存储数据在服务器端,cookie在客户端。

2、session没有数据大小限制 ,cookie有。

3、session数据安全,cookie相对于不安全。

 

posted @ 2020-05-24 22:06  半颗桃核  阅读(584)  评论(0编辑  收藏  举报