Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
cookie是客户端技术。session是服务端技术
一、cookie
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
- Cookie大小有限制4kb;
- 300个cookie浏览器上限
cookie使用:
Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//客户端通过request 获取cookie
Cookie[] cookies = req.getCookies();
PrintWriter out = resp.getWriter();
//判断cookies是否存在
if (cookies != null) {
out.write("上一次访问的cookie是");
//存在并匹配的话,就以时间戳的方式显示出来
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("LoginTime")) {
String value = cookie.getValue();
long l = Long.parseLong(value);
Date date = new Date(l);
out.print(date.toString());
}
}
}
else{
out.write("这是第一次访问的cookie");
System.out.println("第一次访问");//没有显示出来
}
long time = System.currentTimeMillis();
//服务器 响应cookie
Cookie cookie = new Cookie("LoginTime",time+"");//键值对
resp.addCookie(cookie);
}
注意此处不显示:第一次访问,说明cookie不是第一次拿到
删除cookie
1、不设置有效期,关闭浏览器,自动失效;
2、设置有效期时间为 0 ;
Cookie cookie = new Cookie("LoginTime",System.currentTimeMillis()+"");//键值对
cookie.setMaxAge(0);
resp.addCookie(cookie);
二、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","周丹");
String id = session.getId();
//判断session是不是新创建的
if(session.isNew()){
resp.getWriter().write("session创建成功"+id);
}
else{
resp.getWriter().write("session已经存在了,id="+id);
}
}
}
在另外的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 将demo中的数据取出来
HttpSession session = req.getSession();
String name = (String) session.getAttribute("name");//取出session
resp.getWriter().write(name);
System.out.println(name);
}
}
注销session(手动和自动)
//手动注销session
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();
<session-config>
<!--15分钟session自动失效-->
<session-timeout>15</session-timeout>
</session-config>