Servlet 的 Cookie 和 Session 机制,面试谈谈对 springboot 的理解
Cookies 作用:会话保持,如完成用户的登录与状态保持
Cookies 的工作原理:
客户端向服务区发起登录请求
服务器脚本(代码)向浏览器发送一组 Cookies,例如:姓名,年龄等
浏览器将这些信息存储在本地计算机上,以备将来使用
当下一次浏览器向 web 服务器发送任何请求时。浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别账户
[](
)Cookies 构成
Cookies 通常设置在 HTTP 头信息中,设置 Cookie 的 http 请求,会向 Servlet 发送如下信息
Set-Cookie 头包含了一个名称值对,一个 GMT 日期,一个路径和一个域,名称和值都会被 URL 编码
expires 字段是一个命令,告诉浏览器在给定的时间和日期之后过去(“忘记”)该 Cookie
如果浏览器被配置为存储 Cookies,他将会保留此信息知道到期日期
如果用户端的浏览器指向任何匹配该 Cookie 的路径和域的页面,他会重新发送 Cookie 到服务器,浏览器的头信息可能会如下:
此时 Servlet 就能够通过请求方法 request.getCookies()访问 Cookie,该方法将返回一个 Cookie 对象的数组
[](
)Servlet 操作 Cookie 方法
[](
)代码示例:
如果想要了解 IDEA 配置 Tomcat 运行 Servlet 项目,可点击
[IDEA 配置 Tomcat 运行 servlet 详解](
)
具体步骤,创建两个后端类,分别为:
设置 cookie 信息
获取 cookie 信息
设置 cookie 信息代码
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;
import java.io.PrintWriter;
public class SetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServlet
Response resp) throws ServletException, IOException {
//1.创建 Cookie 对象
//首先需要一个 cookie 对象,这里我们需要两个 cookie 对象,一个来存储用户名(username——java),一个来存储密码(pwd——javas)
Cookie username = new Cookie("uesrname","java");
Cookie pwd = new Cookie("pwd","javas");
//当我们创建好两个 cookie 对象之后,就可以对这两个对象进行一系列操作
//比如:设置他的过期时间,这里我们将 username 的过期时间设置为永久
username.setMaxAge(-1);
//密码 pwd 的过期时间设置为一分钟,注意他的过期时间是以秒为单位
pwd.setMaxAge(60);
//2.将 Cookie 对象关联到 response 上
resp.addCookie(username);
resp.addCookie(pwd);
//显示给用户部分的信息
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//然后写入响应给客户端的内容
PrintWriter writer = resp.getWriter();
writer.println("<h1>Cookie 设置成功</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
注意:一定不要忘记配置 web.xml 文件
结果验证:
获取 cookie 信息代码
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;
import java.io.PrintWriter;
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//读取 Cookie 的信息
//因为客户端的 cookie 可能会有多个,所以我们使用数组来接收,注意:cookie 是从 request 获取的
Cookie[] cookies = req.getCookies();
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
//然后读取 cookie 的内容
for (Cookie item: cookies
) {
writer.println(String.format("<h1>Cookie key: %s,Cookie value: %s</h1>",item.getName(),item.getValue()));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
注意:
1.不要忘记配置 web.xml 文件
2.因为上面我们设置 cookie 信息的时候,pwd 的过期时间为一分钟,当我们要去获取 cookie 信息的时候就看时间不够,所以建议修改更长的过期时间。
验证结果
评论