目录
一、本质
1.没有Cookie的状态
2.创建Cookie对象并返回
三、Cookie时效性
1.理论
2.代码
3.会话和持久化Cookie对比
五、Cookie的应用
六、Kaptcha
1.为什么需要验证码?
2.Kaptcha如何使用?
kaptcha.jar链接
3.Kaptcha验证码图片的各个属性
4.KaptchaServlet生成验证
一、本质
- 在浏览器端临时存储数据
- 键值对
- 键和值都是字符串类型
- 数据量很小
二、Cookie在浏览器和服务器之间的传递
1.没有Cookie的状态
在服务器端没有创建Cookie并返回的情况下,浏览器端不会保存Cookie信息。双方在请求和响应的过程中也不会携带Cookie的数据。
2.创建Cookie对象并返回
- 创建Cookie对象
- 在客户端保存Cookie
- 页面跳转
package com.atguigu.cookois.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;@WebServlet("/cookie01")
public class CookieServlet01 extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.创建一个Cookie对象Cookie cookie = new Cookie("uname","jim");//2.将这个Cookie对象保存在浏览器端response.addCookie(cookie);//3.页面跳转request.getRequestDispatcher("hello01.html").forward(request,response);}
}
三、Cookie时效性
1.理论
- 会话级Cookie
- 服务器端并没有明确指定Cookie的存在时间
- 在浏览器端,Cookie数据存在于内存中
- 只要浏览器还开着,Cookie数据就一直都在
- 浏览器关闭,内存中的Cookie数据就会被释放
- 持久化Cookie
- 服务器端明确设置了Cookie的存在时间
- 在浏览器端,Cookie数据会被保存到硬盘上
- Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
- 持久化Cookie到达了预设的时间会被释放
服务器端返回Cookie时附带过期时间的响应消息头如下:
服务器通知浏览器删除Cookie时的响应消息头如下:
2.代码
// ※给Cookie设置过期时间
// 正数:Cookie的过期时间,以秒为单位
// 负数:表示这个Cookie是会话级的Cookie,浏览器关闭时释放
// 0:通知浏览器立即删除这个Cookie
cookie.setMaxAge(20);
3.会话和持久化Cookie对比
四、Cookie的domain和path
上网时间长了,本地会保存很多Cookie。对浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的domain和path属性值来和当前访问的地址进行比较,从而决定是否携带这个Cookie。
五、Cookie的应用
- 记住用户名密码十天:setMaxAge(60*60*24*10)
- 十天免登录
六、Kaptcha
1.为什么需要验证码?
- 防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登录、灌水。
- 有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试
2.Kaptcha如何使用?
①添加jar包
kaptcha.jar链接
链接:https://pan.baidu.com/s/1G_6RBPSJx_n4Dd70rT215A?pwd=7dpm
提取码:7dpm
②在web.xml文件中注册KaptchaServlet,并设置验证码图片的相关属性
③在html页面上编写一个标签,然后设置src等于KaptchaServlet对应的url-pattern
3.Kaptcha验证码图片的各个属性
在常量接口:Constants中
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>KaptchaServlet</servlet-name><servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class><init-param><param-name>kaptcha.border.color</param-name><param-value>blue</param-value>
<!-- 边框颜色 --></init-param><init-param><param-name>kaptcha.textproducer.char.string</param-name><param-value>abcdefg</param-value>
<!-- 在abcdefg范围内选择字符 --></init-param></servlet><servlet-mapping><servlet-name>KaptchaServlet</servlet-name><url-pattern>/kaptcha.jpg</url-pattern></servlet-mapping>
</web-app>
public class Constants {public static final String KAPTCHA_SESSION_KEY = "KAPTCHA_SESSION_KEY";public static final String KAPTCHA_SESSION_DATE = "KAPTCHA_SESSION_DATE";public static final String KAPTCHA_SESSION_CONFIG_KEY = "kaptcha.session.key";public static final String KAPTCHA_SESSION_CONFIG_DATE = "kaptcha.session.date";public static final String KAPTCHA_BORDER = "kaptcha.border";public static final String KAPTCHA_BORDER_COLOR = "kaptcha.border.color";public static final String KAPTCHA_BORDER_THICKNESS = "kaptcha.border.thickness";public static final String KAPTCHA_NOISE_COLOR = "kaptcha.noise.color";public static final String KAPTCHA_NOISE_IMPL = "kaptcha.noise.impl";public static final String KAPTCHA_OBSCURIFICATOR_IMPL = "kaptcha.obscurificator.impl";public static final String KAPTCHA_PRODUCER_IMPL = "kaptcha.producer.impl";public static final String KAPTCHA_TEXTPRODUCER_IMPL = "kaptcha.textproducer.impl";public static final String KAPTCHA_TEXTPRODUCER_CHAR_STRING = "kaptcha.textproducer.char.string";public static final String KAPTCHA_TEXTPRODUCER_CHAR_LENGTH = "kaptcha.textproducer.char.length";public static final String KAPTCHA_TEXTPRODUCER_FONT_NAMES = "kaptcha.textproducer.font.names";public static final String KAPTCHA_TEXTPRODUCER_FONT_COLOR = "kaptcha.textproducer.font.color";public static final String KAPTCHA_TEXTPRODUCER_FONT_SIZE = "kaptcha.textproducer.font.size";public static final String KAPTCHA_TEXTPRODUCER_CHAR_SPACE = "kaptcha.textproducer.char.space";public static final String KAPTCHA_WORDRENDERER_IMPL = "kaptcha.word.impl";public static final String KAPTCHA_BACKGROUND_IMPL = "kaptcha.background.impl";public static final String KAPTCHA_BACKGROUND_CLR_FROM = "kaptcha.background.clear.from";public static final String KAPTCHA_BACKGROUND_CLR_TO = "kaptcha.background.clear.to";public static final String KAPTCHA_IMAGE_WIDTH = "kaptcha.image.width";public static final String KAPTCHA_IMAGE_HEIGHT = "kaptcha.image.height";public Constants() {}
}
4.KaptchaServlet生成验证码
KaptchaServlet在生成验证码图片时,会同时将验证码信息保存到session中,因此,我们在注册请求时,首先将用户文本框中输入的验证码值和session中保存的值进行比较,相等则进行注册
@WebServlet("/kaptcha01")
public class KaptchaServletDemo01 extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();Object obj = session.getAttribute("KAPTCHA_SESSION_KEY");System.out.println(obj);//ceebd}
}
控制台输出结果