java基础79 会话管理(Cookie技术、Session技术)
1、概念
会话管理:管理浏览器和服务器之间会话过程中产生的会话数据。
Cookie技术:会话数据保存到浏览器客户端。【存 编号/标记(id)】
Session技术:会话技术会保存到服务器端(内存)。 【存 具体值】
2、Cookie技术(会话数据保存到浏览器客户端)
2.1、Cookie的核心API
1、服务器端创建cookie对象
Cookie cookie=new Cookie(“name”,”value”);
2、设置Cookie
void setPath(java.lang.String uri)
void setMaxAge(int expiry)
void setValue(java.lang.String newValue)
3、把cookie发送给浏览器端;
Response.addCookie(cookie);
4、 浏览器带着cookie信息访问服务器(通过请求头:)
Cookie[] cookies=request.getCookies(); //服务器接收cookie数据
局限:
1、只能保存字符串数据,不能保存中文
2、一个cookie不能超过4kb
2.2、Cookie原理
1)服务器创建cookie对象,把会话数据存储到cookie对象中
New Cookie(“name”,”value”);
2)服务器发送cookie到浏览器
Response.addCookie(cookie);
3)浏览器得到服务器发送的cookie,然后在保存到浏览器端
Cookie:name=rose(隐藏带着叫cookie名称的请求头)
4)服务器接收到浏览器带来的cookie信息
Request.getCookies();
2.3、Cookie的细节
1)SetPath:设置cookie的有效路径。有效路径指保存到哪里,那么浏览器在有效的路径下方访问是就带有cookie信息,否则就不带。
2)setMaxAge(int time):设置cookie的有效时间。
正整数:表示cookie]数据保存到浏览器的缓冲目录(硬盘中),数值表示保存的时间。
负整数:表示cookie保存浏览器的内存中,浏览器关闭cookie就丢失。
零:表示删除同名的cookie数据
3)cookie数据类型值能保存非中文的数据类型。可以保存cookie,但是浏览器一般只允许放300个cookie,每个站点最多只能放20个Cookie,每个cookie的大小限制4Kb
2.4、实例
例1
1 package com.shore.cookie; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.Cookie; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 /* 12 * 第一个cookie的程序 13 * */ 14 public class CookieDemo1 extends HttpServlet { 15 16 public void doGet(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 19 /*request.setAttribute("name","hello"); 20 request.getRequestDispatcher("GetData").forward(request, response);*/ 21 //创建Cookie对象 22 Cookie cookie1=new Cookie("name","rose"); 23 //Cookie cookie2=new Cookie("email","1314@qq.com"); 24 /* 25 * 1)设置Cookie的有效路径:默认情况下,有效路径在当前的web应用下./MyCookie 26 * cookie.setPath("/MyCookie") 27 * */ 28 //cookie1.setPath("/MyCookie2"); 29 //response.addCookie(cookie2); 30 /* 31 * 2)设置cookie的有效时间 32 * 正数:表示cookie保存到浏览器的缓存目录(硬盘中),数值表示保存时间 33 * 负整数:表示cookie数据保存浏览器的内存中.浏览器关闭cookie就失效!! 34 * 零:表示删除同名的cookie数据 35 * */ 36 cookie1.setMaxAge(100); 37 //cookie2.setMaxAge(30);//5秒 从最后步调用cookie开始计算的 38 //cookie1.setMaxAge(-1); 39 response.addCookie(cookie1); 40 Cookie[] cookies=request.getCookies(); 41 if(cookies!=null){ 42 for (Cookie c : cookies) { 43 String name=c.getName(); 44 String value=c.getValue(); 45 System.out.println("name="+name+";value="+value); 46 } 47 }else{ 48 System.out.println("没有接收到cookie数据"); 49 } 50 } 51 }
例2
1 package com.shore.cookie; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class GetData extends HttpServlet { 12 13 public void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 /*String name=(String)request.getAttribute("name"); 16 System.out.println(name);*/ 17 Cookie[] cookies=request.getCookies(); 18 /*if(cookies!=null){ 19 for (Cookie c : cookies) { 20 String name=c.getName(); 21 String value=c.getValue(); 22 System.out.println("name="+name+";value="+value); 23 } 24 }else{ 25 System.out.println("没有接收到cookie数据"); 26 }*/ 27 } 28 }
例3
1 package com.shore.cookie; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class DeleteCookie extends HttpServlet { 12 13 public void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 /* 17 * 需求:删除Cookie 18 * */ 19 Cookie cookie=new Cookie("name", "xxxx"); 20 cookie.setMaxAge(0);//删除同名cookie 21 response.addCookie(cookie); 22 System.out.println("删除成功"); 23 } 24 }
3、Session技术(会话数据保存到服务器端[内存])
3.1Session的核心API
1、创建和得到Session对象
HttpSession session=Request.getSession(); //创建或者得到Session对象
Request.getSession(false); //得到session对象
2、会话数据保存Session对象中,和得到会话数据
Session.setAttribute(“name”,Object); //保存数据
Session.getAttribute(“name”); //得到数据
注意:
1、session.setMaxInactiveInterval(时间); //设置session过去时间
2、session.invalidate(); //手动销毁session对象
3.2、session细节
1、getId():得到session编号
2、两个getSession方法
1)getSession()/getSession(true):创建或得到session对象。没有匹配的session编号时,会自动创建新的session对象。
2)getSession(false):得到session对象。没有匹配的session编号时,返回null。
3、session对象销毁的时间
3.1、自动销毁session对象
1)默认情况下,为30分钟,过时 浏览器会自动回收
2)修改(设置)session的回收时间。
3)全局修改
<!-- 修改session的全局有效时间:分钟 --> <session-condig> <session-timeout>时间数字</session-timeout> </session-condig> |
3.2、手动销毁session对象
1)直接调用invalidate();方法
3.3、实例
SessionDemo1.java文件
1 package com.shore.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import javax.servlet.http.HttpSession; 11 12 /** 13 * @author DSHORE / 2018-9-9 14 * 15 */ 16 public class SessionDemo1 extends HttpServlet { 17 18 public void doGet(HttpServletRequest request, HttpServletResponse response) 19 throws ServletException, IOException { 20 21 //创建session对象 22 HttpSession session=request.getSession(); 23 //创建cookie对象 24 Cookie c=new Cookie("JSESSIONID",session.getId());//键值对 25 session.setMaxInactiveInterval(10); //设置Session的有效时间为10秒 26 c.setMaxAge(60*60);//3600秒 27 response.addCookie(c);//把值添加到浏览器的cookie中 28 session.setAttribute("name","Jack"); 29 System.out.println(session.getId()+"---->SessionDemo1的值"); 30 } 31 }
SessionDemo2.java文件
1 package com.shore.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 /** 12 * @author DSHORE / 2018-9-9 13 * 14 */ 15 public class SessionDemo2 extends HttpServlet { 16 17 public void doGet(HttpServletRequest request, HttpServletResponse response) 18 throws ServletException, IOException { 19 20 //创建session对象 21 HttpSession session=request.getSession(false); 22 if(session!=null){ 23 String sessionName=(String)session.getAttribute("name"); 24 System.out.println(sessionName); 25 System.out.println(session.getId()); 26 }else{ 27 System.out.println("id不对"); 28 } 29 } 30 }
结果图
实例解析:
1、第一次访问创建的session对象时,给session对象分配一个唯一的id,叫JSESSIONID。
HttpSession session=request.getSession();
2、把JSESSIONID作为cookie的值发送给浏览器保存。
Cookie c=new Cookie("JSESSIONID",session.getId());
response.addCookie(c);//把值添加到浏览器的cookie中
3、第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器。
4、服务器得到JSESSIONID,并在服务器的内存中搜索是否存在对应编号(id)的session对象。
if(session!=null){
String sessionName=(String)session.getAttribute("name");
System.out.println(sessionName);
System.out.println(session.getId());
}else{
System.out.println("id不对");
}
5、如果找到对应编号的session对象,则直接返回该对象。
6、如果找不到对应编号的session对象,则创建新的session对象,循环第1到底6步(骤)。
结论:通过cookie(浏览器端的请求头)中的JSESSIONID编号,去服务器中寻找session对象对应的值。
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/9613620.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |