目录
前言
一、什么是Cookie?
二、Cookie的作用
三、Cookie的工作原理
四、使用Cookie存储数据
1.创建Cookie对象
Cookie的常用方法
2.将Cookie对象写入响应
3.从请求中读取Cookie数据
五、Cookie禁用后sessionId如何传递
URL重写技术
六、Cookie的应用——实现自动登录
七、Cookie和Session的区别
相同点
不同点
由于一系列原因: 没有将Cookie和session融入到一块讲,这里给大家一个session的链接:
(1条消息) Session的生命周期_千小半的博客-CSDN博客
前面学习了session对象,服务器产生的sessionId会在响应的过程中返回到客户端保存,其实sessionId的是通过一个名为JSESSIONID的Cookie对象去保存然后发送给浏览器的。那么什么是Cookie呢?它又是如何存储数据的呢?
Cookie是由服务器端产生并发送给客户端浏览器的,浏览器会将发送过来的Cookie存储到某个文件中,随后再一次请求时,会自动带着存储的Cookie一并请求到服务器端(注意: Cookie虽然保存了sessionId,但它并不是JSP的内置对象,是需要实例化的)。
负责客户端和服务器端的文本传递,最终文本保存在浏览器。
浏览器发送第一次请求时,服务器会判断有没有Cookie,如果没有就创建Cookie,以名值对的形式将sessionId保存在Cookie中并响应,浏览器接收响应并把Cookie保存在客户端浏览器,当浏览器下一次发送请求时,request中会自动带着Cookie去发送到服务器端,服务器接收处理并再次响应。
Cookie保存的sessionId
Cookie newCookie=new Cookie(String name,String value);
Cookie存储的数据类型是字符串
方法名称 | 说明 |
void setMaxAge(int expiry) | 设置Cookie的有效期,以秒为单位 : 当expiry 参数大于0时,表示Cookie的有效期 : 当expiry 参数等于0时,表示客户端删除该Cookie : 当expiry 参数小于0或者不设置时,表示Cookie关闭浏览器窗口后失效。 |
void setValue(String value) | 在Cookie创建后,对Cookie进行赋值 |
String getName() | 获取Cookie的名称 |
String getValue() | 获取Cookie的值 |
int getMaxAge() | 获取Cookie的有效时间,以秒为单位 |
response.addCookie(newCookie);
写入响应Cookie才能被浏览器保存
Cookie是使用name/value的形式保存的,它是一个数组,遍历数组时需要使用getName()方法来审查。
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userName")) {
//执行操作
}
}
sessionId是通过Cookie去响应到浏览器的,如果Cookie被禁用那么sessionId该如何传递呢?
原理: 在服务器中,通过重定向重写技术将sessionId拼接到url中一起响应到客户端。客户端收到响应,判定是否是重定向,再次使用上次的重写地址向服务器发送请求。
方法
response.sendRedirect(reponse.encodeRediectURL("响应页面"))
必须使用重定向实现!!!
浏览器Cookie和重写技术一起使用浏览器Cookie优先生效!!!!
通过以下流程图来分析Cookie的实际应用。
示例: Cookie最典型的应用就是判定用户是否已经登录过,用户会得到是否记住密码,下次就可以直接访问,不用登录,那么Cookie怎么去实现自动登录呢。
思路如下:
使用Cookie实现自动登录的前提是,第一次登录是必须勾选记住我,然后取出用户名和密码创建Cookie并将信息存入Cookie,最后响应到浏览器,在下次请求时,用户直接越过登录访问index首页时,判定request是否有Cookie,如果有就直接访问,没有就返回登录页面(session用来判定用户是否已经登录)。
login.jsp示例(登录页面)
用户点击登录跳转到do_login验证登录页面(这里逻辑处理没有使用Servlet: JSP其实也可以啦)。
do_login.jsp 示例(逻辑处理页面)
request获取请求的数据,然后判断用户输入的用户名和密码是否匹配,匹配的话就判定复选框的是否为null,不为null的话说明用户已勾选记住我(创建Cookie的用户名和密码),(如果信息不匹配则返回登录页面),否setMaxAge设置Cookie的有效时长,随后响应到浏览器,别忘了在session中存入用户名,用来判断用户是否已经登录。验证成功后重定向到首页。
<%
String userName = request.getParameter("userName");
String password = request.getParameter("passWord");
String remember = request.getParameter("remember");
if ("admin".equals(userName) && "123".equals(password)) {
if (remember != null) {
//创建Cookie
Cookie userNameCookie = new Cookie("userName", userName);
Cookie passWordCookie = new Cookie("passWord", password);
userNameCookie.setMaxAge(60 * 5);
passWordCookie.setMaxAge(60 * 5);
//响应Cookie到浏览器
response.addCookie(userNameCookie);
response.addCookie(passWordCookie);
}
session.setAttribute("userName", userName);
response.sendRedirect("/index.jsp");
return;
}else
{
response.sendRedirect("/login.jsp");
}
%>
index.jsp 示例(首页)
如果session没有数据==null,代表用户第一次访问,如果Cookie不为null说明用户是自动登录执行一系列操作,否则返回登录页面。
<%
Object userName = session.getAttribute("userName");
Cookie[] cookies = request.getCookies();
if (userName == null) {
//避免第一次请求时没有Cookie: 错误: session最终还是会创建
if(cookies!=null)
{
String name = "";
String pwd = "";
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userName")) {
name = cookie.getValue();
}
if (cookie.getName().equals("passWord")) {
pwd = cookie.getValue();
}
}
if (name.equals("admin") && pwd.equals("123")) {
//登录成功,重定向到首页
session.setAttribute("userName", name);
} else {
System.out.println(session.getId());
//登录失败。重定向到登录页面
response.sendRedirect("/login.jsp");
return;
}
}
}
%>
用户名:<%=session.getAttribute("userName")%>
session数据保存的问题
一种情况: 用户第一次直接访问首页,Cookie实现自动登录后,此时session里是没有值的,因为session值的添加是在登录时添加的,所以需要在Cookie验证成功后添加session的值。
判定Cookie!=null的问题!!!
我一开始觉得Cookie不判定也可以实现啊,但是不然,如果不判定Cookie!=null的话,页面会报空指针异常,虽然Cookie里是有sessionId的,但是第一次请求的时候他没有Cookie啊!!!!,服务器最终会创建一个Cookie,但是在这之前,Cookie是等于null的!!!