前言
在 Web 应用程序中(艰深点,能够了解成一个网站),Session 和 Cookie 是两个十分重要的概念,次要用于实现用户身份认证、数据传递等性能。明天就来讲讲这两个货色。
对于过后刚开始接触到这两个概念的我来说,这两个货色是十分含糊的,当然,这样也和我本人 Java 根底不牢固无关,导致在学习 Java Web 的过程中,埋下了许多地雷。现如今,从新梳理下,心愿能给屏幕前的你带来播种。
本篇文章指标人群是学了后忘了的,学了后想要坚固的。当然,还没学,那就更好啦,间接看这一篇就够了!
Session 的概念
Session 是 Web 应用程序中的一种会话管理机制,用于存储和保护用户的会话状态。
那问题来了,什么是「会话」?
会话是指在用户与服务器之间的一系列申请和响应之间的交互过程。
当用户拜访 Web 利用时,服务器会创立一个惟一的会话 ID,并将其存储在用户的浏览器中的 Cookie 中。在接下来的申请中,浏览器会将会话 ID 作为参数发送给服务器,以便服务器能够辨认用户并将其申请与之前的申请相关联。
为什么会有 Session?
因为 HTTP 协定是无状态的 ,当用户在网站中进行屡次申请,服务器并不能判断这些申请是不是来自同一用户,所以呈现了一种技术,这种技术称为「 会话跟踪技术」。
会话跟踪技术就能解决这个问题。与无状态的通信相比,会话是一种有状态的通信,这种通信至多须要一方来保护以后的状态信息和历史信息。
而 Session 就是其中一种会话跟踪技术,当然,前面说的 Cookie 也是。
,并将 Session ID 存储在 Cookie 中或者 URL 参数中。
Session 的原理
Session 的原理是基于服务器端的存储和治理,因而相对来说比拟平安。在用户拜访 Web 应用程序时,服务器会为每个用户创立一个惟一的 Session ID,服务器会将 Session ID 和对应的会话状态存储在内存或者数据库中,同时也返回一份 Session ID 给浏览器,让浏览器存储在 Cookie 中,并在肯定工夫内放弃无效。当用户进行后续的申请时,服务器会依据 Session ID 来辨认用户,并获取和保护用户的会话状态。最初,当用户敞开浏览器或者超过肯定工夫没有流动时,服务器会主动销毁对应的 Session。
Session 的长处是安全性绝对较高,存储容量能够存储任意数据类型,并且能够设置生效工夫。然而它也存在一些毛病:
- 存储在服务器端,须要占用服务器资源(比方内存资源)
- 生效工夫短,个别只有数分钟或数小时
- 难以跨域共享,不同域名的服务器无奈共享 Session
代码如何写?
那服务器这边是怎么去存储和治理的呢?代码是怎么写的呢?
在 Java Web 中,能够应用 Servlet API 中封装好的 Session 对象(HttpSession)来进行操作。
在 Servlet API 中,HttpSession 由 Servlet 容器(比方 Tomcat)创立,它能够存储任意的 Java 对象,咱们能够通过 setAttribute()
办法将对象绑定到 Session 中,之后通过 getAttribute()
办法获取绑定在 Session 中的对象。
也就是说,能够在一次会话的屡次申请间共享数据,将数据保留在服务器端的对象中。
- 获取 Session 对象
咱们能够通过 HttpServletRequest 的 getSession() 办法来获取 HttpSession 对象。如果 HttpSession 对象不存在,则会创立一个新的 Session 对象。
Session 罕用办法
以下是一些罕用的 Session 对象的办法:
setAttribute(String name, Object value)
:将一个名为 name,值为 value 的对象绑定到 Session 中。getAttribute(String name)
:获取 Session 中绑定的名为 name 的对象。removeAttribute(String name)
:从 Session 中删除名为 name 的对象。getId()
:获取 Session 的惟一标识符。getCreationTime()
:获取 Session 的创立工夫。getLastAccessedTime()
:获取 Session 的最初拜访工夫。setMaxInactiveInterval(int interval)
:设置 Session 的最大不流动工夫距离,单位为秒。getMaxInactiveInterval()
:获取 Session 的最大不流动工夫距离。
示例代码:
SessionServlet
:
@WebServlet(name = "SessionServlet", urlPatterns = "/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取 Session 对象
HttpSession session = req.getSession();
// 将用户名存储到 Session 中
session.setAttribute("username", req.getParameter("username"));
// 重定向到另一个页面
resp.sendRedirect("anotherPage.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);
}
}
这里应用了 @WebServlet
来配置这个 Servlet,解决的申请映射的门路为 /session
,次要进行了 Session 对象的相干操作,存储了用户信息,重定向到另一个页面,通过 Session,此时在另一个页面,就可能获取到存储的信息。
anotherPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<html>
<head>
<title> 这里是有 Session 的 </title>
</head>
<body>
<%
String username = (String) session.getAttribute("username");
%>
<h2> 从 Session 中获取的信息:<%=username%></h2>
</body>
</html>
生成惟一 ID 返回给浏览器
@WebServlet(name = "SessionIdServlet", urlPatterns = "/sessionId")
public class SessionIdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();
// 获取 SessionID
String sessionId = session.getId();
// 创立名为 JSESSIONID 的 Cookie
Cookie cookie = new Cookie("JSESSIONID", sessionId);
// 设置 Cookie 效工夫为 30 分钟
cookie.setMaxAge(30 * 60);
// 将 Cookie 追加到响应中返回给浏览器
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);
}
}
通过浏览器向这个门路 /sessionId
发动申请,就会接管到服务器返回的响应,这里的响应就有咱们进行解决的名为 JSESSIONID 的 Cookie
Cookie 的概念
Cookie 和 Session 总是会被拿来比拟的。Cookie 和 Session 都是用来跟踪浏览器用户身份的会话技术,或者说一种机制。它们都能够实现在多个页面之间共享用户的状态。
Cookie 的原理
Cookie 是一种在客户端(浏览器)保留数据的机制。
浏览器第一次发送申请到服务器,服务器就创立 Cookie(下面的代码中咱们写了),该 Cookie 中蕴含着信息,能够是用户的信息(用户偏好设置、广告偏好),然将该 Cookie 发送到浏览器。
浏览器之后再次拜访服务器时就会携带服务器创立的 Cookie,这不须要咱们做任何操作,不须要写任何代码,浏览器帮咱们实现了在每一次的申请中都携带上 Cookie。服务器端通过 Cookie 中携带的数据辨别不同的用户。
Cookie 的长处是能够长时间保留,并且能够在客户端设置,然而它也存在一些毛病:
- 安全性绝对较差,容易被不法分子获取
- 存储容量无限,个别只能存储 ASCII 码
- 生效工夫能够设置,然而客户端能够随时革除 Cookie
总结
Session 是一种服务器端的存储机制,它将用户状态信息存储在服务器上,每个用户都有一个独立的 Session。
在用户第一次拜访服务器的时候,服务器会为其创立一个 Session,并将 Session ID 放到一个名为 JSESSIONID 的 Cookie 中发送给浏览器。
Cookie 是一种客户端(浏览器)存储机制,它将用户状态信息存储在客户端浏览器上。咱们晓得,用户第一次拜访服务器的时候,服务器会将一些数据(比方 JSESSIONID)写入 Cookie 并发送给客户端,客户端在后续的申请中会将 Cookie 发送给服务器。
在存储容量方面,Cookie 的存储容量较小,个别只能存储 ASCII 码,而 Session 能够存储任意数据类型。在安全性方面,Session 绝对于 Cookie 更加平安,因为 Session 存储在服务器,客户端无奈间接拜访。在跨域共享方面,Cookie 能够跨域共享,而 Session 只能在同一域名下共享。
最初的最初
由自己程度所限,不免有谬误以及不足之处,屏幕前的靓仔靓女们
如有发现,恳请指出!
最初,谢谢你看到这里,谢谢你认真对待我的致力,心愿这篇博客对你有所帮忙!
你轻轻地点了个赞,那将在我的心里世界削减一颗亮堂而夺目的星!