一、什么是cookie?
①:Cookie翻译过来是饼干.
②:Cookie是服务器通知客户端保存键值对的一种技术.
③:每个 Cookie的大小不能超过4kb
④:每次请求的时候,只要客户端有Cookie,都会被发送给服务器.
二、如何创建Cookie?
①:在服务器端new Cookie( name, value ) ;
②:调用 response.addCookie( cookie ); 通知客户端Cookie 保存( 或修改 )
/**
* 创建cookie
* @param request
* @param response
*/
public void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1、创建cookie,只有有参构造
Cookie cookie = new Cookie("key","value");
// 2、调用 response.addCookie( cookie ); 通知客户端Cookie 保存( 或修改 )
response.addCookie(cookie);
Cookie cookie1 = new Cookie("cccKey","cccValue");
response.addCookie(cookie1);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("已经创建cookie,并返回");
}
三、服务器如何获取客户端发送过来的Cookie?
①:当浏览器向服务器发送请求时,浏览器中有cookie,只要发请求,就会将cookie的相关信息发送给服务器(通过请求头)
②:服务器获取浏览器中传递的cookie,只需要使用api—》request.getCookies():Cookie[] 即可得到全部Cookie
// cookie.getName() 获取Cookie的键或名称 值
// cookie.getValue() 获取当前Cookie的值
/**
* 获取创建的cookie信息
* @param request
* @param response
* @throws IOException
*/
public void getCookies(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=UTF-8");
// 1、获取前台传递的所有cookie
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for (Cookie cookie:cookies) {
// 2、将获取到的cookie具体信息写到页面展示
response.getWriter().write(cookie.getName() +":"+ cookie.getValue() + "
");
}
}
// 3、获取具体的cookie
Cookie cookie = CookieUtils.findCookie("key",cookies);
if(cookie != null){
System.out.println(cookie.getName());
response.getWriter().write("亲爱的.我找到了你要的Cookie
");
}
}
四、cookie值得修改
①:
直接在服务器端创建一个同名的cookie对象,
在创建的构造器方法中直接赋于新值,
调用 response.addCookie( cookie ); 通知客户端保存修改
②:
先查找到需要修改的Cookie对象
调用 setValue() 方法设置新的值
调用 response.addCookie() 通知客户端保存
/**
* 修改cookie
* @param request
* @param response
*/
public void upCookie(HttpServletRequest request, HttpServletResponse response){
/**
* 方案一:
* 1 直接在服务器端创建一个同名的cookie对象 === 修改aaa值为aaaNewValue
* 2 在创建的构造器方法中直接赋于新值
*/
Cookie cookie = new Cookie("cccKey","cccNewKey");
response.setContentType("text/html;charset=UTF-8");
response.addCookie(cookie);
/**
* 方案二:
* 1 先查找到需要修改的Cookie对象
* 2 调用 setValue() 方法设置新的值
* 3 调用 response.addCookie() 通知客户端保存
*/
Cookie cookie1 = CookieUtils.findCookie("key",request.getCookies());
// 注意:如果Cookie值为中文,建议使用BASE64编码后再保存
cookie1.setValue("newValue");
response.addCookie(cookie1);
}
五、cookie得生命周期
Cookie也是有存活时长的.Cookie的存活时长由一个api设置决定.
setMaxAge()
1 正数 表示浏览器在指定的秒数后被删除 ( 或失效 )
2 负数 表示浏览器关闭,Cookie就会被删除( 默认值也是-1 )
3 零 表示浏览器收到响应后,马上删除Cookie
/**
* 设置cookie声明周期
* setMaxAge()
* 1 正数 表示浏览器在指定的秒数后被删除 ( 或失效 )
* 2 负数 表示浏览器关闭,Cookie就会被删除( 默认值也是-1 )
* 3 零 表示浏览器收到响应后,马上删除Cookie
* @param request
* @param response
*/
public void cookieLife(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1、创建cookie
Cookie cookie = new Cookie("life3600","life3600");
// 2、设置cookie的存活时间
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("创建一个可以存活一小时的cookie");
}
六、Cookie有效路径Path的设置
Cookie的path路径,可以设置Cookie在哪些请求下才发送给服务器.
①:Cookie1 的path为: /工程路径 表示请求地址为: http://ip:port/工程路径/所有资料 都会发送给服务器.
②:cookie2 的path为:/工程路径/abc 表示请求地址为: http://ip:port/工程路径/abc/* 都会发给服器.
示例:
比如现在有两个Cookie
CookieA path=/工程路径
CookieB path/工程路径/abc
请求有以下几个:
http://ip:port/工程路径/a.html
CookieA 会发
CookieB 不发
http://ip:port/工程路径/abc/a.html
CookieA 会发
CookieB 会发
/**
* 测试cookie有效路径的设置
* @param request
* @param response
* @throws IOException
*/
public void testCookiePath(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=UTF-8");
Cookie cookieA = new Cookie("cookieAKey","cookieAValue");
// cookieA设置的路径为:/atguigu8_cookieAndsession 其也是默认值
cookieA.setPath(request.getContextPath());
response.addCookie(cookieA);
Cookie cookieB = new Cookie("cookieBKey","cookieBValue");
// cookieB设置的路径为:/atguigu8_cookieAndsession/abc
cookieB.setPath(request.getContextPath() + "/abc");
response.addCookie(cookieB);
response.getWriter().write("创建了两个Cookie用于对比");
}
}
七、免输入用户名登录—使用cookie完成的功能
免用户名登录指的是,一个表单.当用户第一次访问的时候,是需要登录的.第一次登录成功后.
用户名就会被记录下来.当用户第二次访问的时候,这个表单里就会直接有之前登录的用户名信息,只需要输入密码即可.
/**
* 免 用户名登录
*/
@WebServlet(name = "UserServlet" ,urlPatterns = "/userServlet")
public class UserServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
if("admin".equals(username) && "admin".equals(password)){
Cookie cookie = new Cookie("username",username);
// 设置cookie存活周期为一周
cookie.setMaxAge(60 * 60 * 24 * 7);
resp.addCookie(cookie);
resp.getWriter().write("登录成功");
}else {
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面-</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/userServlet" method="post">
用户名:<input type="text" id="username" name="username" value="${cookie.username.value}" /><br>
密码:<input type="password" name="password" id="password" /> <br>
<input type="submit" value="免用户名登录">
</form>
</body>
</html>