本文为JavaWeb基础Cookie 和 Session相关知识详细介绍,**Java全栈学习路线可参考:**[【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引](https://blog.csdn.net/qq_42146402/article/details/127133435),内含最全Java全栈学习技术清单
什么 Http 无状态:
Http 请求的无状态带来的问题和影响:
如何解决 Http 请求的无状态的问题:
所以 Session、Cookie 并不是 Http 协议自身的技术点,而是 Java 语言为了弥补 Http 无状态的问题而产生成的一种技术机制。
如果要解决 Http 无状态的问题,无外乎就是在服务器端或客户端存储数据信息。
服务器端存储数据信息的方式:
客户端存储数据信息的方式:
完整交互:
存在的问题:
解决方案:
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。
(1)服务端编写一个首页的 Servlet 类来存放 Session。
@WebServlet("/page/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request.setAttribute("username","yykk");
HttpSession session = request.getSession();
session.setAttribute("username","yykksession");
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
(2)客户端浏览器会把这个 sessionid 写入到浏览器的 Cookie 中进行存放,方便后续的每个请求都携带这个 sessionid 进行访问。
(3)服务端编写一个用户中心的 Servlet 类,用户中心发起请求时会通过 Cookie 的 Domain 和 Path 确认,如果这个请求是在同一个 Cookie 的域和上下文中,就会在请求头中携带 sessionid 请求服务器,如果这个 sessionid 和服务器的 sessionid 相同就会直接获取 Session 进行后续操作。
@WebServlet("/user/index")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
(4)Session 会话时长默认是 30 分钟,可以通过配置修改。
<session-config>
<session-timeout>30session-timeout>
session-config>
Cookie:有时也用其复数形式Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
实际上,Servlet 提供的 HttpSession 本质上就是通过 Cookie 中的 JSESSIONID 去跟踪用户会话。除了这个名称外,其他名称的 Cookie 都可以任意使用。
(1)自定义 Cookie 记录用户选择的语言。
@WebServlet(urlPatterns = "/pref")
public class LanguageServlet extends HttpServlet {
private static final Set<String> LANGUAGES = Set.of("en", "zh");
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String lang = req.getParameter("lang");
if (LANGUAGES.contains(lang)) {
// 指定名称和值
Cookie cookie = new Cookie("lang", lang);
// 在请求以/开头的路径时附加此Cookie
cookie.setPath("/");
// 如果是https网页
// cookie.setSecure(true);
// 添加到响应
resp.addCookie(cookie);
}
resp.sendRedirect("/");
}
}
(2)读取 Cookie。
private String parseLanguageFromCookie(HttpServletRequest req) {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("lang")) {
return cookie.getValue();
}
}
}
return "en";
}
Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~