JavaWeb之会话管理

会话管理

HTTP是无状态的协议,每次客户端访问web页面时,都会打开一个单独的连接到web服务器,服务器不会自动保存客户端请求的任何记录,需要使用cookie和session来将一系列的请求和响应关联起来,维持客户端和服务器之间的会话

Cookie是服务器发送到浏览器并存储在计算机上的文本文件,用于追踪各种信息,记录在客户端,会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器,使得无状态的HTTP协议记录了状态。浏览器可以禁用cookie,可以删除cookie, 在服务器产生,作为响应头的一部分返回给客户端,浏览器收到cookie后,把cookie的键值写入到文本中,发送请求时浏览器会把cookie信息与请求发送给服务器

每个浏览器存储cookie位置不同,所以cookie不能跨浏览器

cookie原理

底层原理:WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求信息中增加Cookie请求头字段将Cookie回传给WEB服务器

操作cookie

创建cookie
java 复制代码
// 第一个参数是cookie的键,第二个参数是cookie的值
Cookie cookie = new Cookie("name","value")
resp.addCookie(cookie)
获取cookie
java 复制代码
Cookie[] cookies = req.getCookies();
设置cookie的一些方法
java 复制代码
// 描述cookie的注释
public void setComment(String purpose) {
  this.comment = purpose;
}
// 设置cookie适用的域名
public void setDomain(String pattern) {
  this.domain = pattern.toLowerCase(Locale.ENGLISH);
}
// 设置过期时间(单位是秒),如果不设置,cookie在当前session中有效
// 如果设置生命周期会写在文件里
// 如果不设置生命周期会写在浏览器内存里,浏览器关闭,cookie就没了
public void setMaxAge(int expiry) {
  this.maxAge = expiry;
}

// 设置cookie适用的路径,如果不指定,在当前目录及其子目录的URL下会返回cookie,request.getContext
public void setPath(String uri) {
  this.path = uri;
}

// 是否只在加密的连接上(SSL)发送
public void setSecure(boolean flag) {
  this.secure = flag;
}

// 设置cookie值
public void setValue(String newValue) {
  this.value = newValue;
}


public void setVersion(int v) {
  this.version = v;
}
获取cookie属性的方法
java 复制代码
// 获取cookie的注释,如果没有为null
public String getComment() {
  return this.comment;
}
// 获取cookie适用的域名
public String getDomain() {
  return this.domain;
}
// 获取cookie过期时间,如果为-1,cookie表示持续到浏览器关闭
public int getMaxAge() {
  return this.maxAge;
}
// 获取cookie适用的路径
public String getPath() {
  return this.path;
}
// 获取是否只在加密的连接上发送
public boolean getSecure() {
  return this.secure;
}
// cookie的名称,创建后不可修改
public String getName() {
  return this.name;
}
// 获取cookie值
public String getValue() {
  return this.value;
}

public int getVersion() {
  return this.version;
}
删除cookie

设置生命周期 cookie.setMaxAge()方法设置,秒为单位,若为0,表示立即删除该cookie,将该cookie放到响应中返回

注意:一个servlet设置的cookie可以被同一个路径下或者子路径下的servlet读到,其他访问不到

​ 路径是指url可以通过cookie.setPath()方法设置cookie的作用范围

cookie适用场景

  • 会话状态管理(如自动登录,不需要填写用户名和密码、购物车等)
  • 浏览器行为追踪(如浏览记录等)
  • 个性化设置(如用户自定义设置、主题等)

浏览器对于cookie是有限制的,同一域名下的cookie数量不能超过20个

session

session代表着服务器和客户端一次会话的过程,是记录在服务器端,获取session需要把sessionId传递给服务端,通过sessionId来取到对应的session,关闭浏览器,session不会被销毁,还可以通过sessionId找到该session(但是此时浏览器发送数据时已不会携带该sessionId,导致出现session销毁的错觉),在同一个application下的servlet/jsp可以共享一个session,前提是同一个客户端窗口

操作session

创建或获取session
java 复制代码
// 若为false,如果当前没有关联的session,如返回null;若为true,如果没有则会创建 默认是true
HttpSeesion session = request.getSession(true); 
session的相关方法
java 复制代码
// 返回session的创建时间(单位毫秒)
long getCreationTime();
// 获取sessionId
String getId();
// 返回客户端最后一次发送与该session会话相关的请求的时间(单位毫秒)
long getLastAccessedTime();

ServletContext getServletContext();
// session的过期时间,单位秒
// 也可以在web.xml中设置过期时间,单位为分钟,tomcat默认是30分钟
// <session-config>
//	<session-timeout15></session-timeout>
// </session-config>
void setMaxInactiveInterval(int var1);
// 返回servlet容器在客户端访问时保持session会话打开的最大时间间隔,单位秒
int getMaxInactiveInterval();
// 返回seesion会话中该名称的对象,没有返回null
Object getAttribute(String var1);
// 返回该session会话中所有的名称
Enumeration<String> getAttributeNames();
// 将对象绑定到该session会话中
void setAttribute(String var1, Object var2);
// 移除指定名称的对象
void removeAttribute(String var1);
// 使该session无效
void invalidate();
// 是否为新创建的session(客户端还不知道该session)
boolean isNew();
java 复制代码
// 判断当前请求的session是否合法
req.isRequestedSessionIdValid();
// 判断当前请求是不是从URL发出的
req.isRequestedSessionIdFromURL();
// 判断当前请求是不是从cookie发出的
req.isRequestedSessionIdFromCookie();

session的超时时间

可以在web.xml中配置session的超时时间

xml 复制代码
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

session的实现方式

session有两种实现方式 通过cookie来实现 第一次请求时,响应在响应头set-Cookie中 有jsessionId,把jsessionId放到cookie中,如果浏览器支持cookie,会把jsessionId放到cookie中 默认是存储在内存中的,没有存储在磁盘上,关闭浏览器就会失效 可以进行持久化,使用cookie.setMaxAge

通过URL重写来实现 response.encodeURL(或者encodeRedirectURL方法)两个作用

  • 转码
  • URL后加上jsessionID

session的持久化

由于session会占用内存资源,可以将session进行持久化放到文件或者数据库中保存,Tomcat中使用org.apache.catalina.session.PersistentManager和org.apache.catalina.session.StandardManager两个类来管理session的持久化

StandardManager

StandardManager是在web应用程序关闭时,对内存中的所有HttpSession对象进行持久化,保存在文件系统中,默认位置为tomcat下的

xml 复制代码
\work\Catalina\<主机名>\<应用程序名>\SESSION.ser
PersistentManager

PersistentManager比StandardManager更加灵活,只要某个设备提供了实现org.apache.catalina.Store接口,就可以将HttpSession对象保存到对应的设备下

配置方式为

xml 复制代码
<!-- server.xml配置文件中Context标签下 -->
<Manager className="org.apache.catalina.session.PersistentManager">
  	<Store className="..."></Store>
</Manager>

cookie和session的不同

  • 作用范围不同,cookie保存在客户端,session保存在服务器端
  • 存储大小不同,单个cookie保存的数据不能超过4K,session可以保存更多的数据

zhhll.icu/2021/javawe...

本文由mdnice多平台发布

相关推荐
暗黑起源喵4 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong9 分钟前
Java反射
java·开发语言·反射
九圣残炎42 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge1 小时前
Netty篇(入门编程)
java·linux·服务器
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航2 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself2 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言