会话治理
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.getContextpublic 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的正文,如果没有为nullpublic 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,如果没有则会创立 默认是trueHttpSeesion session = request.getSession(true);
session的相干办法
// 返回session的创立工夫(单位毫秒)long getCreationTime();// 获取sessionIdString 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会话中该名称的对象,没有返回nullObject 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多平台公布