5.Servlet的Cookie和Session
一.会话
两种技术:
-
Cookie:客户端技术
-
Session:服务器技术
常见应用:网站登录之后下一次就可以不再登录。
1.Cookie
使用步骤:
-
服务器从客户端获取cookie信息
-
服务器设置cookie信息返回给客户端
Cookie案例:服务器获取并设置cookie
1 public class CookieDemo01 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 req.setCharacterEncoding("utf-8"); 6 resp.setCharacterEncoding("utf-8"); 7 resp.setContentType("text/html; charset=utf-8"); 8 9 PrintWriter out = resp.getWriter(); 10 11 //服务器从客户端获取cookie 12 Cookie[] cookies = req.getCookies(); 13 14 if (cookies != null) { 15 out.write("你上一次访问的时间是:"); 16 17 for (int i = 0; i < cookies.length; i++) { 18 Cookie cookie = cookies[i]; 19 20 //判断cookie的名字 21 if (cookie.getName().equals("lastLoginTime")) { 22 //获取cookie的值 23 long lastLoginTime = Long.parseLong(cookie.getValue()); 24 25 Date date = new Date(lastLoginTime); 26 27 out.write(date.toLocaleString()); 28 } 29 } 30 } else { 31 out.write("这是您第一次访问"); 32 } 33 34 //服务器给客户端响应一个cookie 35 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); 36 37 //设置cookie的有效期为1天 38 cookie.setMaxAge(24 * 60 * 60); 39 resp.addCookie(cookie); 40 } 41 42 @Override 43 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 44 doGet(req, resp); 45 } 46 }
cookie常用函数:
1 Cookie[] cookies = req.getCookies(); //获取cookie 2 cookie.getName(); // 获取cookie的key 3 cookie.getValue(); //获取cookie的value 4 new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建一个cookie 5 cookie.setMaxAge(24 * 60 * 60); //设置cookie的有效期 6 resp.addCookie(cookie); //浏览器返回给客户端一个cookie
注意事项:
-
一个Cookie只能保存一个信息
-
一个web站点可以给浏览器发送多个cookie但是最多存放20个cookie
-
Cookie大小限制为4kb
-
300个cookie是浏览器的上限
删除Cookie:
-
方法1:不设置cookie的有效期,关闭浏览器后cookie自动失效
-
方法2:设置浏览器有效期为0
删除cookie时,必须先建立一个和需要删除的cookie有一样的键值的cookie
1 //服务器给客户端响应一个cookie 2 Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); 3 4 //设置cookie的有效期为1天 5 cookie.setMaxAge(24 * 60 * 60); 6 resp.addCookie(cookie);
对于中文乱码问题:使用编码和解码
1 cookie = new Cookie("name",URLEncoder.encode("你好!","utf-8")) 2 out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));
2.Session(重点)
(1)什么是Session
-
服务器会给每一个用户(浏览器)创建一个Session对象
-
一个session独占一个浏览器,只要浏览器没有关闭,这个Session就一直存在
-
用户登录之后,整个网站都可以访问这个Session(用于保存用户信息,保存购物车的信息)
(2)Session和cookie的区别
-
Cookie:服务器将数据保存在浏览器上,浏览器保存,可创建多个
-
Session:服务器将数据保存在服务器上用户独占Session,只有一个
(3)Session的使用场景
-
保存一个登录用户的信息
-
保存购物车信息
-
保存在整个网站中经常使用的数据
(4)使用:
SessionDemo01:获得和设置Session
1 public class SessionDemo01 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 //解决中文乱码问题 6 req.setCharacterEncoding("utf-8"); 7 resp.setCharacterEncoding("utf-8"); 8 resp.setContentType("text/html; charset=utf-8"); 9 10 11 //得到Session 12 HttpSession session = req.getSession(); 13 14 15 //设置Session 16 session.setAttribute("name",new Person("小王",24)); 17 18 //获取Session的ID 19 String sessionId = session.getId(); 20 21 //判断session是不是新建的 22 if (session.isNew()){ 23 resp.getWriter().write("session创建成功,ID:"+sessionId); 24 }else{ 25 resp.getWriter().write("session已经在服务器中存在,ID:"+sessionId); 26 } 27 28 29 30 } 31 32 @Override 33 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 34 doGet(req, resp); 35 } 36 }
SessionDemo02:跨Servlet访问Session
1 public class SessionDemo02 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 //解决中文乱码问题 7 req.setCharacterEncoding("utf-8"); 8 resp.setCharacterEncoding("utf-8"); 9 resp.setContentType("text/html; charset=utf-8"); 10 11 //得到Session 12 HttpSession session = req.getSession(); 13 14 Person person = (Person) session.getAttribute("name"); 15 16 resp.getWriter().write("获得person:" + person); 17 } 18 19 @Override 20 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 21 doGet(req, resp); 22 } 23 }
SessionDemo03:手动删除Session
1 public class SessionDemo03 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 HttpSession session = req.getSession(); 6 7 session.removeAttribute("name"); 8 9 //手动注销Session:注销之后就没有之前的那个Session但是会立即创建一个新的Session 10 session.invalidate(); 11 } 12 13 @Override 14 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 15 doGet(req, resp); 16 } 17 }
也可以在web.xml中设置Session的自动失效时间
1 <!--设置15分钟后Session自动失效--> 2 <session-config> 3 <session-timeout>15</session-timeout> 4 </session-config>