Cookie
本文章基于B站UP主:楠哥教你学Java 的课程《Java Web从入门到实战【完整版】》进行整理补充,本文章仅用于个人学习交流使用。
1.基本概念
Cookie是存储在浏览器里面的一个东西,不属于JSP内置对象,是一个全新的内容。
实现会话的一种机制,Cookie存储在客户端/浏览器,seeion存储在服务端。
Cookie 是服务端在 HTTP 响应中附带传给浏览器的⼀个⼩⽂本⽂件,⼀旦浏览器保存了某个 Cookie,在之后的请求和响应过程中,会将此 Cookie 来回传递,这样就可以通过 Cookie 这个载体完成客户端和服务端的数据交互。
用 key-value 的方式存储。
2.创建使用
- 创建cookie
Cookie cookie=new Cookie("name","zhangsan");//创建
response.addCookie(cookie);//响应到客户端
- 读取cookie
Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
for (Cookie cookie2:cookies){
out.write(cookie2.toString()+"<br/>");
out.write(cookie2.getName()+"<br/>");//读取key
out.write(cookie2.getValue()+"<br/>");//读取value
out.write("---------"+"<br/>");
}
![](https://i-blog.csdnimg.cn/blog_migrate/fc57738751a4d04a01d0cd21d90bb634.png)
现在cookie只存储在打开当前项目的浏览器中,如果用新的浏览器打开 cookie.jsp 会报空指针异常,因为不同的浏览器都有着自己的cookie。如果关闭浏览器,再打开,cookie信息不会显示,因为默认情况下cookie的生命周期直到当前浏览器关闭。
3.常用方法
void setMaxAge(int age) 设置 Cookie 的有效时间,单位为秒
int getMaxAge() 获取 Cookie 的有效时间
String getName() 获取 Cookie 的 name
String getValue() 获取 Cookie 的 value
Cookie[] cookies=request.getCookies();
out.write(cookies[0].getMaxAge());//?输出一个奇怪的符号
System.out.println(cookies[0].getMaxAge());//-1 默认值 直到浏览器关闭
4.Cookie 和 Session 的区别
session:
保存在服务器保存的数据是 Object
会随着会话的结束⽽销毁
保存重要信息 **例如:**账号密码信息,如果保存在cookie,能通过cookie的本地文件获取到
cookie:
保存在浏览器保存的数据是 String
可以⻓期保存在浏览器中,⽆会话⽆关
保存不重要信息 **例如:**视频观看记录,再次打开上一次没看完的视频时会从断点处播放
存储⽤户信息方面:
session:
setAttribute(“name”,“admin”) 存
getAttribute(“name”) 取
⽣命周期:
服务端:只要 WEB 应⽤重启就销毁,
客户端:只要浏览器关闭就销毁。
退出登录: session.invalidate()
cookie:
response.addCookie(new Cookie(name,“admin”)) 存
取:
Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
for (Cookie cookie:cookies){ //只能通过遍历+条件判断的方式获取
if (cookie.getName().equals("name"))
out.write("用户名:"+cookie.getValue()+"<br/>");
}
⽣命周期:
不随服务端的重启⽽销毁,
客户端:默认是只要关闭浏览器就销毁,我们通过 setMaxAge()⽅法设置有效期,⼀旦设置了有效期,则不随浏览器的关闭⽽销毁,⽽是由设置的时间来决定。
退出登录: setMaxAge(0)
5.登录案例
描述:用cookie实现用户登录验证,使浏览器能够保存用户信息,即关闭浏览器再回到 welcome 界面时能够正常显示,并实现登出功能,即销毁session.
- 登录界面:cookie_login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/cookielogin" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="登录"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
- 登录验证:验证用户名密码并设置cookie CookieLoginServlet.java
package com.lut.session;
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;
import java.io.IOException;
@WebServlet("/cookielogin")
public class CookieLoginServlet extends HttpServlet {
private String myusername="admin";
private String mypassword="123456";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
if (username.equals(myusername)&&password.equals(mypassword)){
Cookie cookie=new Cookie("name",username);
Cookie cookie1=new Cookie("password",password);
cookie.setMaxAge(60*60*24);//生命周期设为1day
cookie1.setMaxAge(60*60*24);
resp.addCookie(cookie);
resp.addCookie(cookie1);
resp.sendRedirect("cookie_welcome.jsp");
}else {
resp.sendRedirect("cookie_login.jsp");
}
}
}
- 欢迎界面:接收cookie信息,显示欢迎信息----cookie_welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎回来</h1>
<%
Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
for (Cookie cookie:cookies){ //只能通过遍历+条件判断的方式获取
if (cookie.getName().equals("name")){
out.write("用户名:"+cookie.getValue()+"<br/>");
}
if (cookie.getName().equals("password")){
out.write("密 码:"+cookie.getValue()+"<br/>");
}
}
%>
<a href="cookielogout">退出登录</a>
</body>
</html>
注: 登出功能跳转时发生405异常,等待处理…
- 登出设置:销毁cookie,回到主界面----CookieLoginServlet.java
package com.lut.session;
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;
import java.io.IOException;
@WebServlet("/cookielogin")
public class CookieLoginServlet extends HttpServlet {
private String myusername="admin";
private String mypassword="123456";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
if (username.equals(myusername)&&password.equals(mypassword)){
Cookie cookie=new Cookie("name",username);
Cookie cookie1=new Cookie("password",password);
cookie.setMaxAge(60*60*24);//生命周期设为1day
cookie1.setMaxAge(60*60*24);
resp.addCookie(cookie);
resp.addCookie(cookie1);
resp.sendRedirect("cookie_welcome.jsp");
}else {
resp.sendRedirect("cookie_login.jsp");
}
}
}
- 界面展示
注: 从cookie数组获取信息时,每一次cookie的顺序不一定相同,即下一次有可能先显示 用户名,后显示 密码。