会话:就是指从打开浏览器到关闭浏览器的过程。
有状态会话:就是指一个学生来过教室,它下次再来,我们就会知道它曾经来过。
会话(Session)跟踪是web程序中常用的技术,用来跟踪用户的整个会话,常用的会话跟踪技术是Cookie与Session 。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
Cookie小案例
public class Cookie01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
//服务端从客户端获取Cookie
Cookie[] cookies = req.getCookies();
//判断Cookie是否存在
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
Cookie cookie=cookies[i];
//获取cookie的名字
if("lastLoginTime".equals(cookie.getName())){ //避免空指针异常,cookie name可能为空
//获取cookie中的值
long lastTime = Long.parseLong(cookie.getValue());
Date date=new Date(lastTime);
out.print(date.toLocaleString());
}
}
}else {
out.print("cookie为空");
//给服务端添加一个Cookie
}
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+""); //name value都为string类型
//设置cookie的有效期,如果为0 则cookie立即失效
// cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
每次进入页面都会得到一个新的时间,Cookie就是给你个小饼干,你再来找他时会给你一个新的饼干。
知识拓展:
Session(重点)
什么是session?
服务器会给每个用户(浏览器)创建一个Session对象
一个Session独占一个浏览器,只要浏览器没关闭,Session一直存在
用户登录之后,整个网站都可以访问。
Session小案例
public class Session01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session = req.getSession();
//给session存入数据
//setAttribute(String var1, Object var2); 注意值为Object类型,而Cookie是String类型,所以Session可以存放更多的数据!!!
session.setAttribute("name",new Person("小红",18));
//获取session id
String id = session.getId();
//如果session是新创建的
if(session.isNew()){
resp.getWriter().write(id+"创建成功");
}else{
resp.getWriter().write(id+"session已经存在");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
Session2控制台打印Session存放的数据
public class Session2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Person person=(Person) session.getAttribute("name");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Session3手动注销Session
public class Session3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();//手动注销session
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置时间自动注销 Session
<session-config>
<!-- 以分钟为单位-->
<session-timeout>1</session-timeout>
</session-config>
总结Session和Cookie的区别
Cookie是把用户的数据写到用户的浏览器,浏览器保存(可以保存多个)
Session是把用户的数据写到用户独占Session中,服务器端保存(保存重要信息,安全性更高,减少服务器资源的浪费)
Session里面有个Session id,每个用户唯一,session id通过cookie传送。
拓展:servletContext是所有用户共用一个,session是每个人一个