会话治理
HTTP 是无状态的协定,每次客户端拜访 web 页面时,都会关上一个独自的连贯到 web 服务器,服务器不会主动保留客户端申请的任何记录,须要应用 cookie 和 session 来将一系列的申请和响应关联起来,维持客户端和服务器之间的会话
<!– more –>
cookie
Cookie 是服务器发送到浏览器并存储在计算机上的文本文件,用于追踪各种信息,记录在客户端,会在浏览器下次向同一服务器再发动申请时被携带并发送到服务器,使得无状态的 HTTP 协定记录了状态。浏览器能够禁用 cookie,能够删除 cookie,
在服务器产生,作为响应头的一部分返回给客户端,浏览器收到 cookie 后,把 cookie 的键值写入到文本中,发送申请时浏览器会把 cookie 信息与申请发送给服务器
每个浏览器存储 cookie 地位不同,所以 cookie 不能跨浏览器
cookie 原理
底层原理:WEB 服务器通过在 HTTP 响应音讯中减少 Set-Cookie 响应头字段将 Cookie 信息发送给浏览器,浏览器则通过在 HTTP 申请信息中减少 Cookie 申请头字段将 Cookie 回传给 WEB 服务器
操作 cookie
创立 cookie
// 第一个参数是 cookie 的键,第二个参数是 cookie 的值
Cookie cookie = new Cookie("name","value")
resp.addCookie(cookie)
获取 cookie
Cookie[] cookies = req.getCookies();
设置 cookie 的一些办法
// 形容 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 属性的办法
// 获取 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
// 若为 false,如果以后没有关联的 session,如返回 null;若为 true,如果没有则会创立 默认是 true
HttpSeesion session = request.getSession(true);
session 的相干办法
// 返回 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();
// 判断以后申请的 session 是否非法
req.isRequestedSessionIdValid();
// 判断以后申请是不是从 URL 收回的
req.isRequestedSessionIdFromURL();
// 判断以后申请是不是从 cookie 收回的
req.isRequestedSessionIdFromCookie();
session 的超时工夫
能够在 web.xml 中配置 session 的超时工夫
<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 下的
\work\Catalina\< 主机名 >\< 应用程序名 >\SESSION.ser
PersistentManager
PersistentManager 比 StandardManager 更加灵便,只有某个设施提供了实现 org.apache.catalina.Store 接口,就能够将 HttpSession 对象保留到对应的设施下
配置形式为
<!-- server.xml 配置文件中 Context 标签下 -->
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="..."></Store>
</Manager>
cookie 和 session 的不同
- 作用范畴不同,cookie 保留在客户端,session 保留在服务器端
- 存储大小不同,单个 cookie 保留的数据不能超过 4K,session 能够保留更多的数据
https://zhhll.icu/2021/javaweb/ 根底 /7. 会话治理 /
本文由 mdnice 多平台公布