JavaWeb
一、课程目标
【掌握】cookie的使用
【理解】cookie的存储位置
【了解】cookie的优缺点
二、cookie缓存
2.1 概念
当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
服务器向客户端发送Cookie时,会在HTTP响应头中增加Set-Cookie响应头信息。Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体如下:
Set-cookie: color=red;Path=/;
在上述事例中:color表示Cookie的名称,red表示Cookie的值,Path表示Cookie的属性。
注意:Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号;和空格分隔。
2.2 工作原理
1)首先浏览器向服务器发出请求。
2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。
3)然后把该Cookie对象放在响应头,一并发送回浏览器。
4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。
5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。
6 ) 服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。
2.3 cookie的使用
2.3.1 添加cookie
//1、创建cookie对象
Cookie cookie=new Cookie("name1", "张三");
//2、使用响应对象将数据返回保存至客户端
response.addCookie(cookie);
2.3.2 获取cookie
//客户端请求服务器时 从请求对象中获取所有的cookie
Cookie[] cookies = request.getCookies();
//遍历cookie集合 根据名字获取对应的value
for (Cookie cookie : cookies) {
//判断是否为指定cookie
if("name".equals(cookie.getName())){
//获取对应的值
System.out.println(cookie.getValue());
}
}
2.3.3 编码解码
在浏览器进行存储时往往数据的类型与保持时的类型不匹配为了避免保存解析获取后乱码问题,在保存前需要将数据进行编码,保存后进行解码
URLEncoder.encode(“张三”, “UTF-8”);//编码
URLDecoder.decode(cookie.getValue(), “UTF-8”);//解码
2.3.4 生效时间
cookie存储在客户端,占用客户端资源,如果大量网站使用cookie存储数据,会导致客户端存储压力过大,所以需要设置cookie的存储时间,客户端在到达对应时间后会自动删除cookie(cookie失效)
设置方式是在创建完cookie对象之后通过方法设置,单位秒,如果将cookie发送至客户端前没有进行设置,那么会默认设置为-1(当前浏览器关闭后失效)
// 创建cookie对象
// 添加编码
String encode = URLEncoder.encode("呵呵达", "utf-8");
Cookie cookie = new Cookie("name", encode);
// 设置cookie存活时间
/*
* 1:默认情况下,Cookie的生命周期是从发送Cookie到浏览器结束
* 2:如果要对Cookie持久化,必须设置Cookie的存活时间,则Cookie存到硬盘中 setMaxAge(expiry) 单位是秒
* 3:如果持久化了之后,浏览器关闭之后重启可以重新获取
*/
cookie.setMaxAge(60*60);// 单位秒
// 使用响应对象将数据返回保存至客户端
//注意:现阶段一般浏览器都会禁用第三方cookie的持久化存储
//只能使用cookie当前浏览器有效
response.addCookie(cookie);
2.3.5 作用域
客户端在请求哪些路径时会携带这个cookie,如果没有设置那么默认添加当前项目名作为路径,在只有在请求当前项目时会携带这个cookie
// 创建cookie对象
// 添加编码
String encode = URLEncoder.encode("呵呵达", "utf-8");
Cookie cookie = new Cookie("name", encode);
// 设置cookie存活时间
/*
* 1:默认情况下,Cookie的生命周期是从发送Cookie到浏览器结束
* 2:如果要对Cookie持久化,必须设置Cookie的存活时间,则Cookie存到硬盘中 setMaxAge(expiry) 单位是秒
* 3:如果持久化了之后,浏览器关闭之后重启可以重新获取
*/
cookie.setMaxAge(60*60);// 单位秒
// 使用响应对象将数据返回保存至客户端
//注意:现阶段一般浏览器都会禁用第三方cookie的持久化存储
//只能使用cookie当前浏览器有效
//1:只要访问同一个Tomcat中所有的项目资源,都会携带Cookie
cookie.setPath("/");
//2:只要访问我当前项目中的所有资源,都会携带Cookie1
//cookie.setPath("/AiTest/");
//3:只要访问我当前项目中的abc目录下所有资源,都会携带Cookie
//cookie.setPath("/AiTest/abc");
response.addCookie(cookie);
2.3.6 修改cookie
只需要创建相同name的cookie对象,设置要修改的属性重新发送给客户端即可
2.3.6 删除cookie
//创建cookie对象将value设置为空
Cookie cookie=new Cookie("name", "");
//设置cookie对象与要删除的cookie同一作用域
cookie.setPath("/");
//设置存活时间为0
cookie.setMaxAge(0);
//设置cookie value
cookie.setValue("");
response.addCookie(cookie);
2.4 实例
使用cookie实现记住密码(登录时可以选择勾选记住密码,下次在登录时,账号密码会直接书写在相应位置,无需输入直接点击登录即可)
remember.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="remember" method="post">
账号:
<input type="text" name="username" value="<%=request.getAttribute("username")%>"><br>
密码:
<input type="password" name="password" value="<%=request.getAttribute("password")%>"><br>
<input type="checkbox" name="rem">记住密码<br>
<input type="submit" value="登录">
</form>
</body>
</html>
RememberServlet.java
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
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;
@WebServlet("/remember")
public class RememberServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = request.getCookies();
String username="";
String password="";
if(cookies!=null){
for (Cookie cookie : cookies) {
if("username".equals(cookie.getName())){
username=URLDecoder.decode(cookie.getValue(), "utf-8");
}else if("password".equals(cookie.getName())){
password=URLDecoder.decode(cookie.getValue(), "utf-8");
}
}
}
request.setAttribute("username", username);
request.setAttribute("password", password);
request.getRequestDispatcher("WEB-INF/remember.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String rem = request.getParameter("rem");
if("admin".equals(username)&&"123456".equals(password)){
if("on".equals(rem)){
//登录成功并且需要记住密码
Cookie cookie1=new Cookie("username", URLEncoder.encode(username, "utf-8"));
Cookie cookie2=new Cookie("password", URLEncoder.encode(password, "utf-8"));
cookie1.setMaxAge(60*60*24);
cookie2.setMaxAge(60*60*24);
response.addCookie(cookie1);
response.addCookie(cookie2);
}
//进入成功页面
request.getRequestDispatcher("WEB-INF/ok.jsp").forward(request, response);
}
//System.out.println(username+"|"+password+"|"+rem);
}
}
使用cookie完成3天免密登录(第一次登录时需要输入账号密码,可以勾选复选框免密登录,之后再次请求时无需输入账号密码直接登录成功)
avoid.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="avoid" method="post">
账号:
<input type="text" name="username" value="<%=request.getAttribute("username")%>"><br>
密码:
<input type="password" name="password" value="<%=request.getAttribute("password")%>"><br>
<input type="checkbox" name="rem">3天免密登录<br>
<input type="submit" value="登录">
</form>
</body>
</html>
AvoidServlet.java
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
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;
@WebServlet("/avoid")
public class AvoidServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public AvoidServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取cookie
Cookie[] cookies = request.getCookies();
String username = "";
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("noLogin".equals(cookie.getName())) {
username = URLDecoder.decode(cookie.getValue(), "utf-8");
//从数据库获取是否存在该账号
request.getRequestDispatcher("WEB-INF/ok.jsp").forward(request, response);
}
}
}
if("".equals(username)){
request.getRequestDispatcher("WEB-INF/avoid.jsp").forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String rem = request.getParameter("rem");
if ("zhangsan".equals(username) && "123456".equals(password)) {
if ("on".equals(rem)) {
Cookie cookie = new Cookie("noLogin", URLEncoder.encode(username, "utf-8"));
cookie.setMaxAge(60 * 60 * 24 * 3);
response.addCookie(cookie);
}
request.getRequestDispatcher("WEB-INF/ok.jsp").forward(request, response);
}
}
}