Servlet---Session技术、ServletContext对象

本文深入讲解了Session的工作原理,包括如何使用Session对象实现用户数据共享,以及如何管理和控制Session的有效期。同时,文章还介绍了ServletContext对象,阐述了它在不同用户间共享数据的作用,以及如何在项目中获取和使用它。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Session原理、使用

使用Request对象的作用域可以解决一次请求内的不同Servlet的数据共享问题,学习 Cookie 之后,解决了不同发送请求的数据共享问题。Cookie 是浏览器端的数据存储技术,而Session技术是一个依赖于Cookie的服务器端存储技术

原理:用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID(用来对应某个session对象) Cookie 的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象。保证用户的其他请求能够获取到同一个session对象,从而实现一个用户的不同请求的数据共享。

特点:1)session对象由服务器端进行创建

2)存储在服务器端

3)依赖Cookie技术

4)作用域为一次会话

5)默认存储时间为30分钟。

使用1)创建/获取session对象

HttpSession hs=req.getSession();

1.如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象

2.如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID响应至客户端使用cookie技术存储

3.如果session对象在服务器端超出存储时间被销毁,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。

2)设置session存储时间

hs.setMaxInactiveInterval(int seconds);

session对象的默认存储时间为半个小时,通过此方法可以设置session的存储时间,在指定的存储时间内session对象没有被使用则在服务器端被销毁,如果被使用了则重新计时。

3)设置session强制失效

hs.invalidate();

自主的在服务器端销毁此session对象,如用户需要退出时会使用。

4)存储和获取数据

//存储
hs.setAttribute(String name,Object value);
//获取 返回的数据类型为Object
hs.getAttribute(String name) 

存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。

5)session失效处理

将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。

6)使用时机

一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。

二、ServletContext对象

Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,用ServletContext对象可以解决不同用户之间的数据共享。

1)原理

ServletContext 对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由所有用户共同拥有

生命周期为从服务器启动到服务器关闭。

2)使用

1.获取ServletContext对象

    //第一种方式:
    ServletContext sc=this.getServletContext();
    //第二种方式:
    ServletContext sc2=this.getServletConfig().getServletContext();
    //第三种方式:
    ServletContext sc3=req.getSession().getServletContext();

只要是在一个项目中,无论用哪种方式获得的ServletContext对象都是同一个。

2.使用ServletContext对象完成数据共享

//数据存储
sc.setAttribute(String name,Object value);
//数据获取(返回的是Object类型的数据)
sc.getAttribute("str");

不同的用户可以给ServletContext对象进行数据的存取。

获取的数据不存在返回null

3.获取项目中web.xml文件的全局配置数据

在web.xml中配置一组<context-param>标签只能存储一组键值对数据,多组可以声明多个  <context-param>进行存储。

配置方式

<context-param>
	<param-name>name</param-name>
	<param-value>zhangsan</param-value>
</context-param> 
//根据键的名字返回web.xml中配置的全局数据的值,返回String类型。
sc.getInitParameter(String name); 
//返回键名的枚举
sc.getInitParameterNames();

作用:将静态数据和代码进行解耦

4.获取项目webroot下的资源的绝对路径

//获取的路径为绝对路径,path参数为项目根目录中的webroot下的相对路径
String path=sc.getRealPath(String path);

5.获取webroot下的资源的流对象

//此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
//path参数为项目根目录中的相对路径
InputStream is = sc.getResourceAsStream(String path);

三、ServletConfig对象

ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的每个Servlet单独的配置信息。

在web.xml文件中,在每个<Servlet></Servlet>中,可以配置每个Servlet独有的配置。

<init-param>
    <param-name>config</param-name>
    <param-value>utf-8</param-value>
</init-param>
//获取ServletConfig对象
ServletConfig sc=this.getServletConfig();
//获取web.xml中的配置数据
String code=sc.getInitParameter("config");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值