序号 | 名称 | 数据存放位置 |
---|---|---|
1 | Cookie技术 | 会话数据保存在浏览器客户端。 |
2 | Session技术 | 会话数据保存在服务器端。 |
1、Cookie技术
1.1、特点
Cookie技术:会话数据保存在浏览器客户端。
1.2、Cookie技术核心
Cookie类:用于存储会话数据。
序号 | 类别 | API |
---|---|---|
1 | 构造Cookie对象 | Cookie(String name, String value) |
2 | 设置cookie | void setPath(String uri) :设置cookie的有效访问路径 void setMaxAge(int expiry) : 设置cookie的有效时间 void setValue(String newValue) :设置cookie的值 |
3 | 发送cookie到浏览器端保存 | void response.addCookie(Cookie cookie) : 发送cookie |
4 | 服务器接收cookie | Cookie[] request.getCookies() : 接收cookie |
1.3、Cookie原理
1)服务器创建cookie对象,把会话数据存储到cookie对象中。
Cookie cookie = new Cookie("username","lsieun");
2) 服务器发送cookie信息到浏览器
response.addCookie(cookie);
举例: Set-Cookie: username=lsieun (隐藏发送了一个Set-Cookie名称的响应头)
3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
4)浏览器在下次访问服务器时,会带着cookie信息
举例: Cookie: username=lsieun (隐藏带着一个叫Cookie名称的请求头)
5)服务器接收到浏览器带来的cookie信息
Cookie[] cookies = request.getCookies();//接收浏览器发送的cookie信息 if(cookies != null) { for(Cookie c : cookies) { String cookieName = c.getName(); String cookieValue = c.getValue(); int cookieAge = c.getMaxAge(); out.write(cookieName + ": " + cookieValue + ", Age: " + cookieAge); } }
完整代码:Demo01.java
package com.rk.http.a_cookie; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 发送Cookie到浏览器 * @author lsieun * */ public class Demo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("username","lsieun");//创建Cookie对象 response.addCookie(cookie);//把cookie数据发送到浏览器 System.out.println("Cookie Saved!!!"); } }
完整代码:ReceiveCookie.java
package com.rk.http.a_cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 从浏览器接收Cookie * @author lsieun * */ public class ReceiveCookie extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Cookie[] cookies = request.getCookies();//接收浏览器发送的cookie信息 if(cookies != null)//注意:判断是否为null, 否则空指针 { out.write("Cookie信息:
"); for(Cookie c : cookies) { String cookieName = c.getName(); String cookieValue = c.getValue(); int cookieAge = c.getMaxAge(); out.write(cookieName + ": " + cookieValue + ", Age: " + cookieAge); } } else { out.write("没有Cookie信息
"); } } }
下面通过“HttpServletRequest读取Cookie的请求头”和“HttpServletResponse来设置Set-Cookie的请求头”进行浏览器和服务器端的Cookie传递。
package com.rk.http.a_cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HeaderCookie extends HttpServlet { private int count = 0; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //1.利用getHeader()获取浏览器的Cookie信息 String strCookie = request.getHeader("Cookie"); out.write("从浏览器获取的Cookie信息为:" + strCookie + "
"); int num = 0; synchronized (HeaderCookie.class) { count++; num = count; } //2.利用SetHeader()来设置Cookie信息 response.setHeader("Set-Cookie", "username"+num+"=lsieun"+num); } }
1.4、Cookie的细节
1)void setPath(java.lang.String uri) :设置cookie的有效访问路径。
有效路径,指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。
2)void setMaxAge(int expiry) : 设置cookie的有效时间。
正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
3)Cookie数据类型只能保存非中文字符串类型的。
可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
示例代码Demo02.java
package com.rk.http.a_cookie; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Demo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 1.创建Cookie对象 */ Cookie cookie1 = new Cookie("username","lsieun"); Cookie cookie2 = new Cookie("password","123456"); Cookie cookie3 = new Cookie("email","[email protected]"); Cookie cookie4 = new Cookie("hobby","swiming"); /** * 2.设置cookie的有效路径。默认情况:有效路径在当前web应用下。 */ cookie1.setPath("/");//有效路径是网站的根目录 cookie2.setPath(request.getContextPath());//而下面三种效果是一样的 cookie3.setPath("/myweb"); //cookie4使用默认值 /** * 3.设置cookie的有效时间 * 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。 * 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!! * 零:表示删除同名的cookie数据 */ cookie1.setMaxAge(20);//20秒,从最后不调用cookie开始计算 cookie2.setMaxAge(-1);//cookie保存在浏览器内存(会话cookie) cookie3.setMaxAge(0);//删除同名的cookie数据 //cookie4使用默认值 /** * 4.把cookie数据发送到浏览器 */ response.addCookie(cookie1); response.addCookie(cookie2); response.addCookie(cookie3); response.addCookie(cookie4); } }
1.5、案例- 显示用户上次访问的时间
package com.rk.http.a_cookie; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HistoryCookie extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); /** * 获取当前时间 */ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String curTime = format.format(new Date()); Cookie[] cookies = request.getCookies(); String lastLogonTime = null; if(cookies != null) { for(Cookie c : cookies) { if(c.getName().equals("lastTime")) { lastLogonTime = c.getValue(); //1.把上次访问时间显示到浏览器 out.write("欢迎回来,你上次访问的时间为:" + lastLogonTime + ",当前时间为:" + curTime); //2.更新cookie c.setValue(curTime); c.setMaxAge(1*30*24*60*60); //3.把更新后的cookie发送到浏览器 response.addCookie(c); return;//这里没有用break。是因为break之后,会跳出当前循环,再执行后续代码;而return直接退出当前方法。 } } } //第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie) if(cookies == null || lastLogonTime==null) { //1.显示当前时间到浏览器 out.write("你是首次访问本网站,当前时间为:" + curTime + "
"); //2.创建Cookie对象 Cookie cookie = new Cookie("lastTime",curTime); cookie.setMaxAge(1*30*24*60*60); //3.把cookie发送到浏览器保存 response.addCookie(cookie); } else { } } }