1、Cookie
什么是 Cookie?
- Cookie 翻译过来是饼干的意思
- Cookie 是服务器通知客户端保存键值对的一种技术
- 客户端有了 Cookie 后,每次请求都发送送给服务器
- 每个 Cookie 的大小不能超过 4kb
1.1、Cookie的创建
分析:
BaseServlet 页面
package com.aiguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post请求中文乱码问题
//一定要在获取请求参数之前调用才有效
// req.setCharacterEncoding("UFT-8");
//解决响应中文乱码问题
resp.setContentType("text/html; charset=UTF-8");
String action = req.getParameter("action");
try {
//获取 action 业务鉴别字符串,获取相应的业务,方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
//调用目标业务 方法
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
CookieServlet 页面
package com.aiguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieServlet extends BaseServlet {
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创建成功");
//1.创建Cookie对象
Cookie cookie2 = new Cookie("key2", "value2");
//2.通知客户端保存Cookie
resp.addCookie(cookie2);
resp.getWriter().write("Cookie创建成功");
}
}
Web页面
在 cookie.html页面的 head标签 添加 base路径
一般base路径为工程路径
<base href="http://localhost:8080/cookie_session/">
在 Cookie创建 的a标签 添加 跳转界面,跳转到 CookieServlet 页面,并且附上Servlet端要使用的方法 action=createCookie
<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
运行效果:
1.2、Cookie的获取
- 在 CookieServlet 页面 添加一个 getCookie()方法:
public class CookieServlet extends BaseServlet {
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies){
if ("key2".equals(cookie.getName())){
resp.getWriter().write("找到了需要的Cookie");
break;
}
}
}
- 在 cookie.html 页面 的 Cookie的获取 a标签中 修改跳转页面和跳转时调用的方法
<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
运行效果:
- 将查找指定的Cookie值 提取成工具类
package com.aiguigu.util;
import javax.servlet.http.Cookie;
public class CookieUtils {
public static Cookie findCookie(String name,Cookie[] cookies){
if (name == null||cookies == null||cookies.length ==0){
return null;
}
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
使用该工具类
package com.aiguigu.servlet;
import com.aiguigu.util.CookieUtils;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieServlet extends BaseServlet {
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
Cookie iWantCookie = CookieUtils.findCookie("key2",cookies);
if (iWantCookie != null){
resp.getWriter().write("找到了需要的Cookie");
}
}
}
运行效果:
1.3、Cookie的两种修改方式
第一种:
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.先创建一个要修改的同名的Cookie对象
//2.在构造器,同时赋于新的 Cookie值
Cookie cookie = new Cookie("key1","newValue1");
//3.调用 resp.addCookie(cookie);;通知 客户端 保存修改
resp.addCookie(cookie);
resp.getWriter().write("修改好了");
}
第二种:
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.先查找到需要修改的Cookie对象
Cookie cookie = CookieUtils.findCookie("key2",req.getCookies());
//2.调用 setValue()方法赋予新的Cookie值
cookie.setValue("newVlaue2");
//3.调用resp.addCookie(cookie);通知 客户端 保存修改
resp.addCookie(cookie);
resp.getWriter().write("修改好了");
}
运行结果:
注意:
1.4、不同浏览器怎么查看Cookie
谷歌浏览器查看Cookie:
火狐浏览器查看Cookie:
1.5、Cookie 生命控制
Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge()
整数,表示在指定的秒数后过期
负数,表示浏览器一关,Cookie就会被删除
零,表示马上删除 Cookie
负数
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("defaultLift","defaultLife");
cookie.setMaxAge(-1);//设置存活时间
resp.addCookie(cookie);
}
-1 是默认值,浏览器一关。Cookie就会被删除
1.6、Cookie 有效路径 Path 的设置
Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
path 属性是通过请求的地址来进行有效的过滤
CookieA path=/工程路径
CookieB path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
请求地址如下:
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("path1","path1");
//req.getContextPath() ===>>> 得到工程路径
cookie.setPath(req.getContextPath());
Cookie cookie2 = new Cookie("path2","path2");
//req.getContextPath() ===>>> 得到工程路径
cookie2.setPath(req.getContextPath() + "/abc");
resp.addCookie(cookie);
resp.addCookie(cookie2);
resp.getWriter().write("已经创建一个带有Path路径的Cookie");
}
1.7、练习之免用户登录
分析:
实现
客户端:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080//cookie_session/loginServlet" method="get">
用户名: <input type="text" name="username" value="${cookie.username.value}"><br/>
密 码 : <input type="text" name="password" value=""><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
服务器端:LoginServlet
package com.aiguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("qwe123".equals(username)&&"123qwe".equals(password)){
//登录成功
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 21 *7);
resp.addCookie(cookie);
System.out.println("登录成功");
}else {
//登录失败
System.out.println("登录失败");
}
}
}
2、Session
2.1、什么是 Session 会话?
- Session 就是一个接口(HttpSession)。
- Session 就会会话。它是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个Session会话
- Session 会话中,我们经常用来保存用户登录之后的信息
2.2、创建 Session 和获取(id号,是否为新)
创建和获取 Session。它们的API是一样的。
request.getSession()
第一次调用是:创建Session 会话
之后调用都是:获取前面创建好的 Session 会话对象
isNew():判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是ID值。而且这个ID 是唯一的。
getId()得到 Session 的会话 id值。
创建和获取 Session
protected void creatSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建和获取Session会话对象
HttpSession session = req.getSession();
//判断当前的Session会话,是不是新创建出来的
boolean aNew = session.isNew();
//获取Session唯一标识
String id = session.getId();
resp.getWriter().write("得到的Session,它的id是:" + id + "<br />");
resp.getWriter().write("这个Session是否是新创建的:" + aNew + "<br />");
}
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1","value1");
resp.getWriter().write("值已经设置好了");
}
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object key1 = req.getSession().getAttribute("key1");
resp.getWriter().write("从Session域中获取出的数据是:" + key1);
}
修改 session.html页面的 对应 a 标签的 跳转页面和调用方法
<li><a href="sessionServlet?action=creatSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>
<li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>
<li>Session的存活</li>
运行结果
2.3、生命周期控制
分析:
public void setMaxInactiveInterval(int interval); 设置的超时时间(以秒为单位),超时指定的时长,Session 就会被销毁。
public int getMaxInactiveInterval() 获取 Session 的超时时间
public void invalidate() 让当前 Session 会话马上超时无效。
Session 默认的超时时长为30分钟
因为在Tomcat 服务器的配置文件 web.xml 中 默认有以下配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为:30分钟。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
可以在这个配置中修改 Session 的默认超时时长
代码:
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建和获取Session会话对象
HttpSession session = req.getSession();
//设置当前Session3秒后超时
session.setMaxInactiveInterval(3);
}
2.4、浏览器 和 Session 之前关联的技术内幕
Session 技术,底层其实是基于 Cookie 技术来实现的。
笔记来自尚硅谷Web视频
https://www.bilibili.com/video/BV1Y7411K7zz?p=269