Session与Cookie的原理以及使用小案例>从零开始学JAVA系列
2021/5/24 22:24:38
本文主要是介绍Session与Cookie的原理以及使用小案例>从零开始学JAVA系列,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- Session与Cookie的原理以及使用小案例
- Cookie和Session所解决的问题
- Session与Cookie的原理
- Cookie的原理
- Cookie的失效时机
- 小提示
- Session的原理
- Seesion的失效时机(仅在一个会话当中)
- 第一次请求
- 第二次请求及其之后的请求
- 小提示
- Cookie的原理
- Cookie 和 Session的区别
- Cookie与Session的使用场景及小案例
- 实现登录的记住我功能
- LoginServlet
- index.jsp
- Servlet中获取Session并且设置值,以及JSP中获取Session中的数据
- 实现登录的记住我功能
Session与Cookie的原理以及使用小案例
Cookie和Session所解决的问题
都是用来解决HTTP的无状态问题,由于HTTP每一次请求都相当于不同的用户向服务器发送请求。HTTP协议无法记住浏览器端是不是同一个用户。Cookie和Session都是为了解决一个用户的多次请求之间数据的共享问题,只是实现原理不同,只能实现一个用户多个请求之间的数据共享。
Session与Cookie的原理
Cookie的原理
- 数据是存储在浏览器端的,服务器负责生成Cookie并设置好规则(可访问的路径、过期时间),然后响应给浏览器。
- 浏览器在收到响应的Cookie后,服务器指定的规则内请求服务器端,都会携带上该Cookie
- 服务器则可以通过读取request请求对象中的Cookie信息来进行用户身份的识别等...
提示:
第一次请求时,浏览器没有Cookie信息携带,而是由服务器响应Cookie给浏览器
第2次请求及其之后的请求,浏览器会携带Cookie信息向服务器发送请求(满足Cookie规则的情况)
特点:服务器压力小,不用存储任何数据,但是一旦浏览器的Cookie信息清除后,再向服务器发送请求时,相当于一个新的用户。
Cookie的失效时机
- 当浏览器的Cookie过期时(默认Cookie过期时间为一个会话,浏览器关掉就没了)
- 当服务器响应中设置cookie过期时间为0时
- 当浏览器的Cookie被清空时
小提示
当浏览器的Cookie的过期时间还没到时,如果浏览器没有清空Cookie,那么就算关掉浏览器,Cookie也依然存在。
Session的原理
- 数据是存储在服务器端的,服务器端通过浏览器请求中名为SessionID的Cookie来识别用户
提示: - 浏览器第一次请求服务器时,就会在服务器端开辟一片空间,其中有sessionId,浏览器会响应一个名为SessionID的Cookie设置到浏览器中
- 当浏览器第二次以及往后的请求时,每次向服务器发送的请求都会携带这个名为SessionId的Cookie
- 服务器就是以该Cookie来识别用户的,以该SessionID去对应的那一片内存空间获取数据。
- 只能解决单个用户的多个请求
Seesion的失效时机(仅在一个会话当中)
- 服务器清空Session:Session.invalidate()
- 超过Session过期时间未活动,在tomcat的conf目录的web.xml中可以看到配置的时间,默认为30分钟(可以在web服务器的web.xml中配置)
<session-config> <session-timeout>30</session-timeout> </session-config>
- 更改当前项目的当前session的失效时间,单位为秒
session.setMaxInactiveInterval(10);
- 当用户将浏览器关闭时。(其实这并没有真正的使服务器的session失效)
解释:由于浏览器向服务器第二次请求以后,都会携带名叫SeesionId的Cookie,而关闭掉了浏览器时,Cookie就被清除了。所以再向服务器访问时,就相当于一个新的用户,服务器会重新在内存中开辟一片空间,其空间通过生成的SessionId访问,并把这个新的SessionId响应给浏览器。
第一次请求
第二次请求及其之后的请求
小提示
即使使用了req.getSession().setMaxInactiveInterval(1000);
设置了session的过期时间,浏览器在关闭时,也会清空session的Cookie。这个设置过期时间是针对服务器端的,到了过期时间,服务器就会销毁该session。
Cookie 和 Session的区别
- Cookie保存在客户端,Session保存在服务器端(SessionId可以通过Cookie保存在浏览器,也可以通过重写URL的方式获得)
- Cookie安全性不高,用户可以通过浏览器直接看到Cookie信息,可以仿造Cookie(可以加密Cookie),Session较为安全
- Session会在一定的时间保存在服务器中,如果访问量增多,考虑性能时,可以考虑使用Cookie
- 单个Cookie在客户端的大小限制是3k,也就是一个站点在客户端保存的数据不能超过3K。而Seesion可以保存任意类型的数据(javaBean等)
Cookie与Session的使用场景及小案例
- Cookie :记住我、网页皮肤、最近浏览商品 - Session:登录的用户信息、购物车(也可以用Cookie)
实现登录的记住我功能
LoginServlet
package com.it.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(urlPatterns = "/Login") public class LoginServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); String readme = req.getParameter("readme"); // 判断用户名和密码是否为空 if("".equals(username) || "".equals(password)){ req.setAttribute("errorMsg","用户名和密码不能为空!"); req.getRequestDispatcher("/index.jsp").forward(req, resp); return; } //1、创建Cookie Cookie cookie1 = new Cookie("username", username); Cookie cookie2 = new Cookie("password", password); // 2、设置Cookie的访问规则, / 当前服务器有效,req.getContextPath() 当前项目有效 cookie1.setPath("/"); cookie2.setPath("/"); // 如果用户点击了readme,则设置Cookie的过期时间为1小时 if(readme != null) { // 3、设置过期时间为1个小时 cookie1.setMaxAge(60 * 60); cookie2.setMaxAge(60 * 60); }else { // 未点击readme,将cookie时间直接设置为过期 cookie1.setMaxAge(0); cookie2.setMaxAge(0); } // 4、响应给浏览器 resp.addCookie(cookie1); resp.addCookie(cookie2); //5、跳转到登录成功页面 resp.sendRedirect(req.getContextPath() + "/success.jsp"); } }
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="zh-CN"> <head> <% String path = request.getContextPath(); String username = ""; String password = ""; // 如果Cookie中没有值,则为空,有值的话设置为checked,让记住我的按钮动态选中 String readme = ""; Cookie[] cookies = request.getCookies(); if (cookies!=null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("username")) { username = cookie.getValue(); readme = "checked"; } if (cookie.getName().equals("password")) { password = cookie.getValue(); } } } %> <base href="<%=path%>/"> </head> <body> <center> <form action="Login"> <p>用户名:<input type="text" name="username" value="<%=username%>"></p> <p>密码:<input type="text" name="password" value="<%=password%>"></p> <p><input type="checkbox" name="readme" <%=readme%> >记住我</p> <p><input type="submit" value="点击登录"></p> </form> </center> </body> </html>
Servlet中获取Session并且设置值,以及JSP中获取Session中的数据
// Servlet的service方法中设置值 req.getSession().setAttribute("username",username); // jsp中获取值,2种方式 sessionId为:<%=session.getId()%> 用户名为:${sessionScope.username} 用户名为:<%=session.getAttribute("username")%>
这篇关于Session与Cookie的原理以及使用小案例>从零开始学JAVA系列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南