一、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");