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然后让客户拿到数据。
下面用一个例子来说明如何向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>
查看结果:
然后获取session中的信息:
注销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也不一样。