Servlet会话跟踪技术
会话: 从用户进入一个网站浏览到退出该网站或者关闭浏览器称为一次会话。
**会话跟踪:**在上述会话过程中浏览器与服务器的多次请求保持数据共享的状态的技术。
Cookie
认识
-
Cookie是服务器发给客户端的一小段文本,保存在浏览器所在客户端的内存或磁盘上.
-
服务器可以从客户端读出这些Cookie。通过Cookie,客户端和服务器端可以建立起一种联系。即Cookie是一种可以让服务器对客户端信息进行保存和获取的机制,从而大大扩展了基于web的功能。
-
Cookie是会话跟踪的一种解决方案。
-
登录网站的时候可以利用Cookie将用户名和密码都保存在客户端,当下一次访问时可以直接读出,用户不需要每次都重新登录。
-
Cookie可用于网站内容的用户定制。
-
用户可以选择自己喜欢的新闻,显示的风格、显示的顺序等。这些相关的信息都保存到客户端的Cookie中。
-
当用户每次访问网站时,就可以按照他预设的内容进行显示。
Cookie的安全机制
- Cookie不会以任何方式在客户端被执行
- 浏览器会限制来自同一个网站(域名)的Cookie数目
不同浏览器限制数目不同 - 单个Cookie的长度是有限制的(4k),浏览器限制了最多可以接受的Cookie数目
使用cookie
方法 | 说明 |
---|---|
getMaxAge()/setMaxAge() | 读取/设置*Cookie的过期时间。如果使用setMaxAge()方法设置了一个负值,表示这个Cookie在用户退出浏览器后马上过期,如果setMaxAge()指定一个0值,表示删除此Cookie |
getValue()/setValue() | 读取/设置Cookie属性值 |
getComment()/setComment() | 读取/设置注释 |
Cookie userCookie = new Cookie("uName",username);
//在客户端保存一周
userCookie.setMaxAge(7*24*60*60);
Session会话
-
Session是在Java Servlet API中引入的一个非常重要的机制,用于跟踪客户端的状态,即在一段时间内,单个客户端与Web服务器之间的一连串的交互过程称为一个会话。
-
HttpSession是Java Servlet API中提供的对Session机制的实现规范。
-
Servlet容器为每一个HttpSession对象分配一个唯一的标识符,称为SessionID,同时将SessionID发送到客户端,由浏览器负责保存此SessionID。
-
通常服务器借助于Cookie把SessionID存储在浏览器进程中,在该浏览器进程下一次访问服务器时,服务器就可以从请求中的Cookie里获取SessionID
-
当客户端再发送请求时,浏览器会同时发送SessionID,Servlet容器从请求对象中读取SessionID,根据SessionID的值找到相应的HttpSession对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sbgFlWb5-1622725244746)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\image-20210603202143966.png)]
Servlet容器与web容器
- servlet容器的主要任务是管理servlet的生命周期。
- web容器即web服务器,管理和部署 web应用。
- web容器最典型的就是tomcat,
- Tomcat是web容器,也是servlet容器。
使用Session
Servlet容器根据HttpServletRequest对象中提供的SessionID来找到相应的HttpSession对象。
创建HttpSession对象有以下两种方式:
- getSession():返回当前请求的会话,如果该会话对象不存在则创建一个新会话。
- getSession(boolean create):返回当前请求的会话。如果当前请求不属于任何会话,而且create参数为true,则创建一个会话, create参数为false则返回null。
getSession()等价于getSession(true)
HttpSession session=request.getSession();//获取当前Session
HttpSession session=request.getSession(true);//获取当前Session
方法名 | 描述 |
---|---|
public void setAttribute(String name,Object value) | 将value对象以name名称绑定到会话 |
public object getAttribute(String name) | 获取指定name的属性值,如果属性不存在则返回null |
public void removeAttribute(String name) | 从会话中删除name属性,如果不存在不会执行,也不会抛出错误 |
public Enumeration getAttributeNames() | 返回和会话有关的枚举值 |
public void invalidate() | 使会话失效,同时删除属性对象 |
public Boolean isNew() | 用于检测当前客户是否为新的会话 |
public long getCreationTime() | 返回会话创建时间 |
public long getLastAccessedTime() | 返回在会话时间内web容器接收到客户最后发出的请求的时间 |
public int getMaxInactiveInterval() | 返回在会话期间内客户请求的最长时间.秒 |
public void setMasInactiveInterval(int seconds) | 允许客户客户请求的最长时间 |
ServletContext getServletContext() | 返回当前会话的上下文环境,ServletContext对象可以使Servlet与web容器进行通信 |
public String getId() | 返回会话期间的识别号 |
Session生命周期
- 客户端向服务器第一次发送请求的时候,request中并无SessionID。
- 此时服务器会创建一个Session对象,并分配一个SessionID。Session对象保存在服务器端,此时为新建状态,调用session.isNew()返回true。
- 当服务器端处理完毕后,会将SessionID通过response对象传回到客户端,浏览器负责保存到当前进程中。
- 当客户端再次发送请求时,会同时将SessionID发送给服务器。
- 服务器根据传递过来的SessionID将这次请求(request)与保存在服务器端的Session对象联系起来。此时Session已不处于新建状态,调用session.isNew()返回false。
- 循环执行过程3-5,直到Session超时或销毁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ysyWLPWX-1622725244750)(C:\Users\MI\AppData\Roaming\Typora\typora-user-images\image-20210603202845574.png)]
每个客户端可以访问多个Servlet办理不同业务,但是一个客户的多个请求将共享一个Session。
同一web应用下的所有Servlet共享一个ServletContext,即Servlet上下文。
HttpSession session = request.getSession();
session.setAttribute("session_param",str);
- 服务器端在处理客户端请求的时候创建了新的HttpSession对象.
- 将会话标识号SessionID作为一个Cookie项加入到响应信息中返回给客户端
- 浏览器再次发送请求时,服务器程序从Cookie中找到SessionID,检索到已为该客户端创建了HttpSession对象,而不必再创建新的对象.
- 从而实现了对同一个客户端的会话跟踪状态。
URL重写
用户禁止了浏览器的Cookie功能,Servlet规范中还引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可与Web服务器保持连续的会话。这种补充机制要求在需要加入同一会话的每个URL后附加一个特殊参数,其值为会话标识号(SessionID)
将SessionID以参数形式附加在URL地址后的技术称为URL重写
ServletContext
-
Servlet上下文是运行Servlet的逻辑容器。同一上下文的所有Servlet共享存于其中的信息和属性
-
在ServletAPI中定义了一个ServletContext接口,用于存取Servlet运行的环境或者上下文信息
-
ServletContext对象可以通过以下方法获得:ServletConfig对象的getServletContext(),Servlet中getServletContext()
-
ServletContext的生命周期:新Servlet容器启动的时候,服务器端会创建一ServletContext对象;在容器运行期间ServletContext对象一直存在;当容器停止时,ServletContext的生命周期结束。
方法名 | 描述 |
---|---|
public object getAttribute(String name) | 取得name的属性值,如果属性不存在则返回null |
public Enumeration getAttributes() | 取得包含在servletContext中的所有属性值,如果属性不存在则返回一个空的Enumeration |
public ServletContext getContext(String urlpath) | 返回一个与给定URL路径相关的ServletContext对象 |
public Enumeration getInitPrarmeterNames() | 返回所有servlet的初始化参数的名称 |
public String getInitPrarmeter(String name) | 返回指定初始化参数的值 |
public int getMajorVersion() | 返回servlet容器支持的Servlet API的主要版本号 |
public String getMimeType(String file) | 返回指定文件的MIME类型 |
public RequestDispatcher getNameDispatcher(String name) | 返回符合指定servlet名称的RequestDispatcher对象 |
public String getRealPath(String path) | 返回相应于指定虚拟路径的物理路径 |
public RequestDispatcher getRequestDispatcher(String path) | 返回一个与给定路径相关的RequestDispatcher对象 |
public URL getReSource(String path) | 返回URL对象,该对象提供对指定资源的访问 |
public InputStream getResourceAsStream(String path) | 将一个输入流返回到指定资源 |
public String getServerInfo() | 返回以名称/格式包含servlet容器的名称和版本 |
public void log(Sting msg) | 将指定的消息写到servlet日至文件中 |
public void setAttribute(String name,Object value) | 将value对象以name名称绑定到会话 |
public void removeAttribute(String name) | 从会话中删除name属性,如果不存在不会执行,也不会抛处错误 |
// 获得ServletContext对象
ServletContext ctx = this.getServletContext();
Integer count=(Integer)ctx.getAttribute("number");
// 获得web.xml中设置的初始化参数
String serverName = ctx.getInitParameter("serverName");
ServletConfig
- Servlet容器初始化一个Servlet对象时,会为该Servlet对象分配一个ServletConfig对象。
- ServletConfig对象包含Servlet的初始化参数信息,它与ServletContext关联。
- 获得初始化参数也可以通过使用ServletConfig对象中的getInitParameter()方法来获得。
ServletConfig sc = getServletConfig();
name = sc.getInitParameter("userName ");
ServletConfig和ServletContext主要区别如下:
(1)ServletConfig作用于某个特定的Servlet;
(2)ServletContext作用于整个Web应用,是所有 Servlet的上下文环境
总结
- Cookie是保存在客户端的小段文本。
- 通过请求可以获得Cookie,通过响应可以写入Cookie
Session是浏览器与服务器之间的一次通话,它包含浏览器与服务器之间的多次请求、响应过程。 - Session可以在用户访问一个Web站点的多个页面时共享信息
在Servlet中通过request.getSession()获取当前Session对象
关闭浏览器、调用Session的invalidate()方法或者等待Session超时都可以使Session失效。 - HttpSession使用getAttribute()和setAttribute()方法读写数据。
- ServletContext是运行Servlet的容器。
- 在Servlet中可通过getServletContext()方法获ServletContext实例。
- ServletContext使用getAttribute()和setAttribute()方法读写数据
结语
如果你发现文章有什么问题,欢迎留言指正。
如果你觉得这篇文章还可以,别忘记点个赞加个关注再走哦。
如果你不嫌弃,还可以关注微信公众号———梦码城(持续更新中)。
梦码在这里感激不尽!!