1.会话:
会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个浏览器,这个过程称为会话

有状态会话:

  • 通过服务端给客户端一个cookie,那么下次客户端访问客户端再带上cookie就可以证明这个客户端曾经访问过这个服务端。Cookie
  • 在服务器端登记客户端访问过了,下一次客户端再访问的时候由服务端来匹配客户端。Session

常见应用:在登录一个网站后,下次再打开该网站不用再次登录

session

  • 服务器技术,利用这个技术可以保存用户的会话信息,我们可以把信息或者数据放在session中

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,那么Session就一直存在
  • 用户登录之后,整个网站都可以访问–>保存用户的信息

Session和Cookie的区别:

  • Cookie是把用户的数据写给用户浏览器,浏览器保存(可以保存多个)
  • Session是吧用户的数据写到用户独占的Session中,服务器端保存(保存重要信息,减少浏览器资源的浪费)
  • Session对象由服务创建

Session在创建的时候做了什么:

  • 创建了一个key为JSESSIONID,value为sessionID的cookie
  • 然后将这个cookie添加给客户端

Session使用场景:

  • 保存一个登陆用户的信息
  • 购物车信息
  • 在整个网站中,经常会使用的数据,我们将它保存在Session中

Session也采用了key-value的存储形式,不同的是Cookie的value只能为String,而Session的value为Object类型,也就是说可以存储对象等各种类型。

下图说明了Session的原理:数据存储在服务器的Session内,客户端只拿得到SessionID,客户端进行验证SessionID然后让客户拿到数据。

security SessionManagementFilter 会话数量不生效_客户端

下面用一个例子来说明如何向Session中存储信息以及如何获取Session中的信息:

首先创建一个实体类Person:我们要在session中存储这个类的对象

package servlet;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private String sex;
private int age;
}

然后创建SessionServlet,来创建并给客户端Session:

package servlet;

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

public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给Session中存储东西
session.setAttribute("person",new Person("张三","男",18));
//获取Session的id
String id = session.getId();
//判断Session是不是新创建的
if (session.isNew()) {
resp.getWriter().print("Session创建成功"+session);
}else{
resp.getWriter().print("Session已经存在了,ID为:"+id);
}
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}

}

然后再写一个获取Session的GetSessionServlet类:

package servlet;

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

public class GetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("person");
//获取Session中key=name的信息
resp.getWriter().print("name为:"+person.getName());
resp.getWriter().print("sex为:"+person.getSex());
resp.getWriter().print("age为:"+person.getAge());
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

分别注册url:session、getsession

<servlet>
<servlet-name>session</servlet-name>
<servlet-class>servlet.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>getsession</servlet-name>
<servlet-class>servlet.GetSessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getsession</servlet-name>
<url-pattern>/getsession</url-pattern>
</servlet-mapping>

查看结果:

security SessionManagementFilter 会话数量不生效_客户端_02


然后获取session中的信息:

security SessionManagementFilter 会话数量不生效_ide_03


注销session:就和关闭浏览器是一个效果

package servlet;

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

public class DeleteSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//删除某个key的session
session.removeAttribute("person");
//注销掉sessionID
session.invalidate();
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

设置session默认失效时间:session在15分钟后自动失效。在失效瞬间生成新Session,SessionID会改变。

<session-config>
<session-timeout>15</session-timeout>
</session-config>

在浏览器打开一个网页就会立刻产生一个Session,并分配SessionID,但产生的Session中并不会存放数据。
因为每个Session都对应的是都是一个浏览器,也就是说两个不同的浏览器同时打开一个网站,这个网站的Session不是同一个,SessionID也不一样。