Session
什么是session
- 服务器会给每个用户(浏览器创建一个session对象)
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
- 用户登录之后,整个网站它都可以访问—>保存用户的信息 保存购物车的信息
Session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器保存(保存重要的信息,减少浏览器的资源浪费)
- Session对象由服务器创建
使用场景:
- 保存一个登录用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将他保存在session中
Session的原理:
案例:创建session
public class SessionDemo 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("name",new Person("王乐乐",1));
//获取session的id
String sessionId = session.getId();
//判断session是不是新创建
if (session.isNew()){
resp.getWriter().write("session创建成功,session的id为"+ sessionId);
}
else{
resp.getWriter().write("session在服务器中已经存在了,session的id为"+ sessionId);
}
//session的id是保存在cookie中的 做了以下的操作
//session是肯定在服务端的内存中,只不过系统会将session id传到客户端并存在cookie中,下次你request到服务端时session id也一同被传回服务端,服务端通过这个id到缓存中找到对应的session。
//关闭浏览器是不会把服务端的缓存session和客户端cookie里存的session id删除的,session和cookie都有个有效期,过了有效期它会自动被清除。
// Cookie cookie = new Cookie("JSESSIONID",sessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
获取session
public class SessionDemo2 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();
Person name =(Person) session.getAttribute("name");
resp.getWriter().write(name.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
手动调用销毁session
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
自动调用 会话过期 web.xml配置
<!-- 设置Session默认失效时间-->
<session-config>
<!-- 1分钟后Session自动失效 以分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>