1. 会话(Session)
会话(Session)是指在网络通信中,为了实现持久化连接而建立的一种交互方式。会话可以在客户端和服务器之间建立,并且在一段时间内保持活动状态,以便在多个请求和响应之间共享信息。
在JavaWeb开发中,Session是一种用于跟踪用户状态和在多个请求之间共享数据的机制。它是基于HTTP协议的会话管理技术。
在用户与Web应用程序进行交互时,服务器会为每个用户创建一个Session对象,并为其分配一个唯一的会话标识符(Session ID)。这个会话标识符通常以cookie的形式发送给客户端,或者可以通过URL重写的方式在URL中传递。客户端在后续的请求中会将会话标识符发送回服务器,以便服务器能够识别和关联该用户的会话。
会话可以用于存储和共享用户的相关信息,例如用户的身份验证状态、购物车内容、用户首选项等。服务器可以将这些信息存储在会话对象中,以便在用户的不同请求之间进行访问和更新。
会话的优点包括:
- 持久化连接:会话可以在多个请求之间保持连接,避免了每次请求都需要重新建立连接的开销。直到关闭了浏览器,也就关闭了这个会话。
- 跨请求共享数据:会话可以存储和共享用户的相关信息,使得在不同请求之间可以方便地访问和更新这些信息。
- 用户状态跟踪:会话可以用于跟踪用户的登录状态和其他状态信息,以便在用户的整个访问过程中保持一致性。
- 安全性:通过使用会话标识符和其他安全机制,可以确保会话的安全性,防止会话劫持和伪造。
2.使用Session对象
HttpSession类的方法:
在Java中,可以通过HttpServletRequest对象的getSession方法来获取Session对象。示例如下:
在Session中设置属性
package com.study.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
public class SessionCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setAttribute("time", System.currentTimeMillis());
PrintWriter writer = resp.getWriter();
if(session.isNew()){
writer.print("This is a new session with ID " + session.getId());
}else{
writer.print("The site has have a session with ID " + session.getId());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在另一个Servlet中读取属性:
package com.study.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class Session2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
PrintWriter writer = resp.getWriter();
Long value = (Long) session.getAttribute("time");
Date date = new Date(value);
writer.print("last time is " + date);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
这说明一个用户在访问一个网站时,一直用的是同一个Session,可以通过这个Session共享数据。
3.关闭Session
方法一:直接关闭浏览器,Session自动结束了。
方法二:Servlet中调用销毁会话的方法:
session.invalidate();
方法三:在web.xml中设置有效时间,单位为分钟
<session-config> <session-timeout>1</session-timeout> </session-config>
4.Session和Cookie的区别
Session和Cookie是在Web开发中用于跟踪用户状态和在多个请求之间共享数据的机制,但它们有一些关键的区别。
存储位置:Cookie是存储在客户端(浏览器)中的小型文本文件,而Session是存储在服务器端的对象。Cookie通过在HTTP请求头中传递,将数据存储在客户端的Cookie文件中。而Session则将数据存储在服务器端的内存或持久化存储中。
数据安全性:由于Cookie是存储在客户端,因此它们容易受到安全攻击,如跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。为了增加安全性,Cookie可以设置HttpOnly和Secure属性,但仍然存在风险。相比之下,Session数据存储在服务器端,对客户端不可见,因此更安全。
容量限制:Cookie的大小通常受到浏览器对Cookie的限制,一般为4KB左右。而Session的容量限制通常由服务器端的配置和可用内存决定,可以存储更大量的数据。
跨域支持:Cookie可以在不同域名之间共享,通过设置Cookie的域属性来实现。而Session默认情况下只在同一个域名下共享。
性能开销:由于Session是存储在服务器端,因此在高并发环境下,大量的Session对象可能会占用服务器的内存资源。而Cookie是存储在客户端,对服务器的负载影响较小。