一、Cookie饼干
1. 什么是Cookie
- Cookie是服务器通知客户端保存键值对的一种技术
- 客户端有了Cookie后,每次请求都发送给服务器
- 每个Cookie的大小不能超过4kb
2. 如何创建Cookie
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 创建Cookie对象
Cookie cookie = new Cookie("key1","value1");
// 2. 通知客户端保存Cookie
resp.addCookie(cookie);
resp.getWriter().write("cookie创建成功");
}
3. 如何获取Cookie
服务器获取客户端的Cookie只需要一行代码:req.getCookie(),就会返回Cookie的数组Cookie[]
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie c:cookies
) {
//getName:返回Cookie的key值
//getValue:返回Cookie的Value值
resp.getWriter().write("Cookie[" + c.getName() + "=" + c.getValue()+"]</br>");
}
}
4. Cookie值的修改
方案一
- 先创建一个要修改的同名的Cookie对象
- 在构造器,同时赋予新的Cookie值
- 调用response.addCookie(cookie)
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 先创建一个要修改的同名的Cookie对象
// 2. 在构造器,同时赋予新的Cookie值
Cookie cookie = new Cookie("key1","allValue");
// 3. 调用response.addCookie(cookie)
resp.addCookie(cookie);
resp.getWriter().write("key1的cookie值已经修改好了");
}
方案二
- 先查找到需要修改的Cookie对象
- 调用setValue()方法赋予新的Cookie值
- 调用response.addCookie(cookie)通知客户端进行保存
protected void updateCookie2(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 先查找到需要修改的Cookie对象
Cookie cookie = CookieUtils.findCookie("key1",req.getCookies());
//2. 调用setValue()方法赋予新的Cookie值
if (cookie != null){
cookie.setValue("values");
}
//3. 调用response.addCookie(cookie)通知客户端进行保存
resp.addCookie(cookie);
}
5. Cookie生命控制
Cookie的生命控制指的是如何管理Cookie什么时候被销毁(删除)
- setMaxAge():
- 正数:表示在指定的秒数后过期
- 负数:表示浏览器一关,Cookie就会被删除(默认的值是负一)
- 零:表示马上删除Cookie
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("default","value2");
cookie.setMaxAge(-1);
resp.addCookie(cookie);
}
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("deleteNow","value2");
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
protected void second(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("30second","value2");
cookie.setMaxAge(30);
resp.addCookie(cookie);
}
6.Cookie有效路径Path的设置
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发送。path属性是通过请求的地址来进行有效的过滤
7. Cookie练习——免输入用户名登录
package com.zc.servlet;
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;
/**
* @author ZC
* @Description
* @date 2020-08-10 23:08
*/
@WebServlet(name = "LoginServlet")
public class LoginServlet extends BaseServlet {
protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("zc".equals(username) && "123".equals(password)){
System.out.println("登录城功夫");
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(60*60*24*7);
response.addCookie(cookie);
}else{
System.out.println("登录失败");
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="http://localhost:8080/13_cookie_session/">
</head>
<body>
<form action="login?action=login" method="post" >
用户名:<input type="text" name="username" value="${cookie.username.value}"></br>
密码:<input type="password" name="password" > </br>
<input type="submit" value="登录">
</form>
</body>
</html>
二、Session
1. 什么是Session会话
- Session就是一个接口(HttpSession)
- Session就是会话,它是用来维护一个客户端和服务器之间关联的一种技术
- 每个客户端都有自己的一个Session会话
- Session会话中,通常用来保存用户登录之后的信息
2. 如何创建一个Session和获取(id号是否为新)
- 如何创建和获取Session。它们的API是一样的
- request.getSession()
第一次调用是:创建Session会话
之后调用都是:获取之前的Session会话 - isNew():判断到底是不是刚创建出来的会话
true:表示刚创建
false:表示获取之前创建的
- 每个会话都有一个身份证号。也就是Id值。而且这个ID是唯一的。
getId()得到Session的会话Id值。
protected void createOrGetSeassion(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
boolean isNew = session.isNew();
String id = session.getId();
resp.getWriter().write("得到的Session,它的Id是"+id+"\n是不是新创建的:"+isNew);
}
3. Session域数据的存取
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1", "value1");
resp.getWriter().write("已经往Session中保存了数据");
}
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("从Session中获取出key1的数据是:" + attribute);
}
4. Session生命周期控制
-
public void setMaxInactiveInterval(int interval)
:设置Session的超时时间(以秒为单位),超过指定的时长,Session就会被摧毁。 -
public int getMaxInactiveInterval()
:获取Session的超时时间 - Session的默认超时时长为30分钟
-
session.invalidate()
:让会话马上超时
注意:session的超时指的是,客户端两次请求的最大时间间隔
5. 浏览器和服务器Session之间关联的技术内幕
Session技术,底层其实是基于Cookie技术实现的