一、Cookie介绍:
HTTP协议时没有记忆的,一次请求结束后,相关的数据就销毁没了。如果第二次请求的时候需要使用相同的数据,难道需要再写一下请求一下吗?比如你登录后,每一次页面点击都需要登录这多麻烦。
也就是说如果需要保存一下用户的请求数据该怎么解决呢?
1.作用
使用Cookie,解决了不同请求间的数据共享问题。
我们把请求需要的共享的请求数据存储再浏览器端,避免用户进行重复的数据书写操作。
Cookie技术是浏览器端的数据存储技术。解决了不同请求需要使用相同的请求数据的问题。
2.特点:
- 不安全
- 适合存储键值对形式的少量数据
- 他是浏览器端的数据存储技术,但存储的数据声明在服务器端。
3.注意:
- 设置多个Cookie存储
一个Cookie对象存储一条数据。如果需要存储多条数据,可以多new几个Cookie对象进行存储。以下是创建Cookie的形式
Cookie c1 = new Cookie("key1", "value1");
Cookie c2 = new Cookie("key2", "value2");
- 设置Cookie存储的时间
临时存储:不设置 cookie 信息的存储时间,则该Cookie生命周期为一次会话,存储在浏览器内存中。浏览器关闭时Cookie失效。
定时存储:设置了Cookie的有效期,存储在用户的电脑硬盘中。在有效期内,符合路径要求的请求都会附带该Cookie信息。
c2.setMaxAge(60*5); // 存储5分钟,5分钟后这个Cookie失效。60秒*5
- 设置什么路径下携带该Cookie信息。不设置默认是每次请求都会携带
c2.setPath("/"); // 在此路径下都带上c2这个Cookie信息
备注:重启服务器Cookie信息是不会失效的,因为Cookie是存放在浏览器端的。如果你在测试时Cookie信息一直在。你可以将浏览器的缓存清除一下。
二、Cookie的简单使用:
1.Cookie创建
- 代码
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie学习:Cookie解决了不同请求的数据共享问题。
*
* @author changsheng
*/
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.设置请求编码格式
req.setCharacterEncoding("utf-8");
// 2.设置响应编码格式
resp.setHeader("content-type", "text/html;charset=utf-8");
// 3.获取请求信息
// 4.处理请求信息
Cookie c1 = new Cookie("temporaryUsername", "Zhangsan"); // 临时存储:将请求中的temporaryUsername参数存放到cookie中
Cookie c2 = new Cookie("timingKey", "5minutes"); // 定时存储:将请求中的timingKey参数存放到cookie中
c2.setMaxAge(60*5); // 存储5分钟,5分钟后这个Cookie失效。60秒*5
c1.setPath("/"); // 在此路径下都带上c1这个Cookie信息
c2.setPath("/"); // 在此路径下都带上c2这个Cookie信息
// 5.响应处理结果
resp.addCookie(c1); // 响应Cookie信息c1给客户端
resp.addCookie(c2); // 响应Cookie信息c2给客户端
resp.getWriter().write("Cookie学习!");
}
- 运行
访问CookieServlet(Servlet),此时会显示已经设置了Cookie信息在这里面。分别是temporaryUsername和timingKey。
响应处理结果时,代码中不要忘记加这两行
resp.addCookie(c1); // 响应Cookie信息c1给客户端
resp.addCookie(c2); // 响应Cookie信息c2给客户端
如果此时随便打一个路径还是可以看到Cookie信息。
假设此时关闭了浏览器,然后重新打开这个随便打的网站,则没有设置时间的Cookie会消失。
原因:
没有设置有效时间的Cookie是存储在浏览器的运行内存中的,浏览器关闭的时候就失效了。
设置了有效时间的Cookie是存储在客户端的硬盘中的。在有效期内,符合路径要求的请求都会附带上这个Cookie信息。
设置Cookie有效期代码:
Cookie c2 = new Cookie("timingKey", "5minutes"); // 定时存储:将请求中的timingKey参数存放到cookie中
c2.setMaxAge(1000*60*5); // 存储5分钟,5分钟后这个Cookie失效
如果设置的Cookie有效期时间到了,那么Cookie信息也就失效了。Cookie也会消失。
如果此时你再次重新访问了 /CookieServlet那么又会重新增加Cookie。就又有Cookie信息了!
2.Cookie获取
使用如下代码获取所有Cookie信息,然后遍历一下即可。
Cookie[] cookies = req.getCookies(); // 获取所有Cookie信息
访问 /GetCookieDataServlet即可获取所有Cookie信息
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie学习:获取所有Cookie信息
*
* @author changsheng
*/
@WebServlet("/GetCookieDataServlet")
public class GetCookieDataServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.设置请求编码格式
req.setCharacterEncoding("utf-8");
// 2.设置响应编码格式
resp.setHeader("content-type", "text/html;charset=utf-8");
// 3.获取请求信息
// 4.处理请求信息
StringBuilder out = new StringBuilder(); // 存放所有Cookie信息
Cookie[] cookies = req.getCookies(); // 获取所有Cookie信息
if (null != cookies) { // 如果不为空则遍历
for (int i = 0; i < cookies.length; i++) {
out.append(cookies[i].getName()+":"+cookies[i].getValue()+"\n");
}
}
// 5.响应处理结果
System.out.println("所有Cookie信息为:\n"+out);
resp.getWriter().write("所有Cookie信息为:\n"+out);
}
}
相关链接:
上一篇:Java EE基础(11):Servlet的请求重发与重定向
当前篇:Java EE基础(12):Cookie对象介绍与使用
下一篇:Java EE基础(13):Cookie三天免登录案例
我的Java EE学习路线:我的Java EE学习路线