一、会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器
二、两种保存会话技术(cookie、session )
2.1 cookie
1、从请求中拿到cookie信息
2、服务器响应给客户端cookie
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器,告诉你,你来的时候,
//处理中文问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies(); //返回为数组,cookies可以是多个
//判断cookie是否存在
if (cookies!=null){
out.write("你上一次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastlogin")){
String time = cookie.getValue();
//转换为long型
long l = Long.parseLong(time);
Date date = new Date(l); //再转换为日期
out.write(date.toLocaleString());
}
}
}else{ //浏览器默认有cookie
out.write("第一次访问页面");
}
//服务器给客户端相应一个cookie
Cookie lastlogin = new Cookie("lastlogin", System.currentTimeMillis() + "");
//设置cookie有效期有1天
lastlogin.setMaxAge(24*60*60);
resp.addCookie(lastlogin);
}
Cookie[] cookies = req.getCookies(); //获取cookie
cookie.getName() //获取cookie的键名
cookie.getValue(); //cookie值
new Cookie(“lastlogin”, System.currentTimeMillis() + “”); //新建一个cookie
resp.addCookie(lastlogin); //响应给客户端一个cookie
lastlogin.setMaxAge(246060); //设置cookie有效期
cookie:一般会保存在本地的用户目录中的appdata
一个cookie只能保存一个信息
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
Cookie大小限制4kb
浏览器上限为300个cookie
删除cookie:
- 不设置有效期,关闭浏览器,cookie自动失效
- 设置有效期时间为0
//创建一个cookie,名字必须与要删除的一致 (即与demo01的cookie中的一致) 这样才可以实现替换
Cookie cookie = new Cookie("lastlogin",System.currentTimeMillis()+"");
//有效期为0,即删除
cookie.setMaxAge(0);
2.2 session
一个用户对应一个session、存放的数据不一致
session方法:
SessionDemo01 存储session
@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","伊利");
//获取session的ID
String id = session.getId();
//判断是否是新的session
boolean aNew = session.isNew();
if (aNew){
resp.getWriter().write("这是新的session,ID为"+id);
}else {
resp.getWriter().write("session已经存在");
}
}
SessionDemo02 获取session存储的数据
@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值
String name = (String) session.getAttribute("name");
System.out.println(name); //伊利
}
删除session
- 方法一
//得到session
HttpSession session = req.getSession();
//注销"name"session
session.removeAttribute("name");
//方法一、手动注销
session.invalidate();
- 方法二
<!--方法二、session的注销
设置session默认的失效时间-->
<session-config>
<!--10分钟后 session自动注销-->
<session-timeout>10</session-timeout>
</session-config>
2.3 cookie和session的区别
cookie:把用户的数据写给用户的浏览器,用浏览器保存(可以保存对个)
session:把用户的数据写到用户独自的session中(用户的session ID),服务器保存(保存重要的消息,减少服务器资源的浪费)
- 可以保存一个登陆用户的消息
- 购物车信息