session失效后怎么获取getattribute_【java笔记】056天;Session和ServletContext;

d38df5adecd8cb142febabf9e1e40910.png

cookie

重定向解决了请求转发中地址栏不改变,导致每次刷新会使数据被重复提交的问题;

但是因为是两次请求,这两次不同的请求很大可能使用了相同的请求数据,而随着第一次的请求的结束,由于HTTP协议的特点,第一次请求的相关数据也会被销毁,其他的请求需要将公共数据重新书写发送。

解决此问题的办法出发点是:让 知道需要使用哪些数据的服务器要告诉浏览器将其他请求会用到的请求数据保存下来,并在其他请求中附带上这些保存下来的数据。

cookie的特点:

浏览器端的数据存储技术;

哪些数据需要被储存是在服务器端进行声明,以响应的方式告诉浏览器进行储存;

不适合体积较大的数据的存储;

一个cookie 是一个键值对;

a784319fc04d4963b6466bdf6e8f88b0.png

74a291d8083b748cbfa427f63a5fa2d1.png

e27e146092e3737cb937755ac374378a.png

3db9185be74523a8ba2798d31220af88.png

df3c2635b484778c3187a2be3daba01d.png

如果没有指定cookie 的保存位置,在浏览器关闭的时候,cookie将会失效。

解决方法:将cookie存放在客户端的硬盘里,并设置cookie的有效期。

cookie使用特点:

如果不设置有效期则默认存储在浏览器的内存里,随着浏览器的关闭而失效;

如果设置了有效期,则存储到客户端的硬盘里,到期后自动销毁

如果不设置有效路径则任意项目路径的请求都会附带存储的cookie信息

如果设置了有效路径则只有在该路径下的请求才会附带设置的cookie信息

Session

Cookie 解决了不用发送请求的数据共享问题。Cookie 是浏览器端的数据存储技术。

Request 对象解决了一次请求内的不同 Servlet 的数据共享问题;

session解决了用户不用请求的数据共享问题 ;

原理:

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

特点:Session 技术是依赖 Cookie 技术的服务器端的数据存储技术。

由服务器进行创建 ;

每个用户独立拥有一个 session ,默认存储时间为 30 分钟。可以在tomcat下的web.xml中进行配置。

强制销毁session:session.invalidate();

只要不关闭浏览器,并且 session 不失效的情况下,同一个用户的任意请求在项目的任意Servlet中获取到的都是同一个session对象。

作用域: 一次会话

48d4be8bdaa7dfd17ca111bc45826049.png

60aed5525fae158d720459c5b58017d4.png

session之优化登录案例

c8a0eb63c97e58a342bfad943d46cf37.png

86572974c83fd74f80687491c8ce7e89.png
登录界面

f3b5401dd2670cf01975ee7d8d959b29.png

ServletContext 对象:

Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题;

而ServletContext 对象 解决了不同用户的数据共享问题 ;

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

特点: 服务器进行创建用户共享;一个项目只有一个

生命周期: 服务器启动到服务器关闭

作用域: 项目内

使用:

创建ServletContext对象

ServletContext sc1 = this.getServletContext();

ServletContext sc2 =this.getServletConfig().getServletContext();

ServletContext sc3=req.getSession().getServletContext();

存储用户共享数据:

sc.setAttribute(String name,Object value);

获取用户共享数据:

sc.getAttribute(String name);

删除共享数据

sc.removeAttribute(String name);

获取web.xml中的全局配置属性,作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。

9239daecef4b6ebee5f59afb5bcfaef1.png

sc.getInitParameter(String name);注意返回的是String类型数据

获取webRoot下的资源流对象:sc.getResourceAsStream(String path);

注意:path为相对路径,写从webRoot开始查找资源的路径即可。

获取webRoot下的资源绝对路径:sc.getRealPath(String path);

注意:path为相对路径,写从webRoot开始查找资源的路径即可。

动态获取WebRoot下资源的流对象:获取服务器中部署好的项目中的资源的流对象。

因为tomcat服务器中运行的几个项目都是在WebRoot中的。所有可以说获取WebRoot下的资源流对象和资源绝对路径其实就是获取tomcat服务器下已经部署的项目中的资源、对象和路径。

向servletContext中存取数据:

先获取ServletContext对象;this.getServletContext();

储存用户数据到ServletContext对象中;ServletContext对象名.setAttribute(String name, Object value);

获得共享数据;ServletContext对象名.getAttribute(String name);——(需要强制类型转换);

9ca1334f3366cbc33447102e0dff19ef.png

eee6d26d7b308bcc3cb02756b2145dba.png

ServletContext对象实现网页访问计数次数:

2f2d9ce269ca680a896144d0df840905.png

ab1f0423a5bb7f79de8d92d4eea6ae3f.png
登录界面

c31af8f3f05b7b31df3967297fa8a58e.png
处理请求;添加计数器

71f885103baad61e92b4d1dd186a21a8.png
响应界面

当服务器关闭时,将实时的计数的值保存,待下次服务器启动时将其以初始数据的形式引入,达到持续计数的功能:

init()

destory()

04e8e8e89793ab0b87ce6ce528b9d44f.png

c5713009dd57b3af922b7087a1c695f4.png

e4e8811ffac5c23bb1cd3a58521a8094.png

12522b3206fed6d4ef0f8f7bfde273e0.png

web.xml中的全局属性数据的配置方式:

全局配置,每个Servlet都能拿到这个配置内容:

39e140770a1aa77fa8177609b66a8397.png

ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信息。 /针对性地在每个servlet的web.xml中配置该Servlet所使用的信息或内容。别的Servlet无法拿到。

先在web.xml中对应的Sevlet配置属性信息,相关的配置信息决定了如何执行对应的Servlet代码。

39c2902543cf3628246c48c5e17fbc72.png

所以在获取请求信息的步骤中除了来自于Request,还有一部分来自于web.xml中的属性配置,通过ServletConfig对象来做。

获取 ServletConfig 对象 :this.getServletConfig();

获取 web.xml 中 servlet 的配置信息:ServletConfig 对象名.getInitParameter();

通过个性化配置,也实现了将当前Servlet部分动作与当前Servlet源文件进行解耦,只需要在xml配置文件中进行相关配置就会改变代码的执行效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值