![d38df5adecd8cb142febabf9e1e40910.png](https://img-blog.csdnimg.cn/img_convert/d38df5adecd8cb142febabf9e1e40910.png)
cookie
重定向解决了请求转发中地址栏不改变,导致每次刷新会使数据被重复提交的问题;
但是因为是两次请求,这两次不同的请求很大可能使用了相同的请求数据,而随着第一次的请求的结束,由于HTTP协议的特点,第一次请求的相关数据也会被销毁,其他的请求需要将公共数据重新书写发送。
解决此问题的办法出发点是:让 知道需要使用哪些数据的服务器要告诉浏览器将其他请求会用到的请求数据保存下来,并在其他请求中附带上这些保存下来的数据。
cookie的特点:
浏览器端的数据存储技术;
哪些数据需要被储存是在服务器端进行声明,以响应的方式告诉浏览器进行储存;
不适合体积较大的数据的存储;
一个cookie 是一个键值对;
![a784319fc04d4963b6466bdf6e8f88b0.png](https://img-blog.csdnimg.cn/img_convert/a784319fc04d4963b6466bdf6e8f88b0.png)
![74a291d8083b748cbfa427f63a5fa2d1.png](https://img-blog.csdnimg.cn/img_convert/74a291d8083b748cbfa427f63a5fa2d1.png)
![e27e146092e3737cb937755ac374378a.png](https://img-blog.csdnimg.cn/img_convert/e27e146092e3737cb937755ac374378a.png)
![3db9185be74523a8ba2798d31220af88.png](https://img-blog.csdnimg.cn/img_convert/3db9185be74523a8ba2798d31220af88.png)
![df3c2635b484778c3187a2be3daba01d.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/48d4be8bdaa7dfd17ca111bc45826049.png)
![60aed5525fae158d720459c5b58017d4.png](https://img-blog.csdnimg.cn/img_convert/60aed5525fae158d720459c5b58017d4.png)
session之优化登录案例 :
![c8a0eb63c97e58a342bfad943d46cf37.png](https://img-blog.csdnimg.cn/img_convert/c8a0eb63c97e58a342bfad943d46cf37.png)
![86572974c83fd74f80687491c8ce7e89.png](https://img-blog.csdnimg.cn/img_convert/86572974c83fd74f80687491c8ce7e89.png)
![f3b5401dd2670cf01975ee7d8d959b29.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/9ca1334f3366cbc33447102e0dff19ef.png)
![eee6d26d7b308bcc3cb02756b2145dba.png](https://img-blog.csdnimg.cn/img_convert/eee6d26d7b308bcc3cb02756b2145dba.png)
ServletContext对象实现网页访问计数次数:
![2f2d9ce269ca680a896144d0df840905.png](https://img-blog.csdnimg.cn/img_convert/2f2d9ce269ca680a896144d0df840905.png)
![ab1f0423a5bb7f79de8d92d4eea6ae3f.png](https://img-blog.csdnimg.cn/img_convert/ab1f0423a5bb7f79de8d92d4eea6ae3f.png)
![c31af8f3f05b7b31df3967297fa8a58e.png](https://img-blog.csdnimg.cn/img_convert/c31af8f3f05b7b31df3967297fa8a58e.png)
![71f885103baad61e92b4d1dd186a21a8.png](https://img-blog.csdnimg.cn/img_convert/71f885103baad61e92b4d1dd186a21a8.png)
当服务器关闭时,将实时的计数的值保存,待下次服务器启动时将其以初始数据的形式引入,达到持续计数的功能:
init()
destory()
![04e8e8e89793ab0b87ce6ce528b9d44f.png](https://img-blog.csdnimg.cn/img_convert/04e8e8e89793ab0b87ce6ce528b9d44f.png)
![c5713009dd57b3af922b7087a1c695f4.png](https://img-blog.csdnimg.cn/img_convert/c5713009dd57b3af922b7087a1c695f4.png)
![e4e8811ffac5c23bb1cd3a58521a8094.png](https://img-blog.csdnimg.cn/img_convert/e4e8811ffac5c23bb1cd3a58521a8094.png)
![12522b3206fed6d4ef0f8f7bfde273e0.png](https://img-blog.csdnimg.cn/img_convert/12522b3206fed6d4ef0f8f7bfde273e0.png)
web.xml中的全局属性数据的配置方式:
全局配置,每个Servlet都能拿到这个配置内容:
![39e140770a1aa77fa8177609b66a8397.png](https://img-blog.csdnimg.cn/img_convert/39e140770a1aa77fa8177609b66a8397.png)
ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信息。 /针对性地在每个servlet的web.xml中配置该Servlet所使用的信息或内容。别的Servlet无法拿到。
先在web.xml中对应的Sevlet配置属性信息,相关的配置信息决定了如何执行对应的Servlet代码。
![39c2902543cf3628246c48c5e17fbc72.png](https://img-blog.csdnimg.cn/img_convert/39c2902543cf3628246c48c5e17fbc72.png)
所以在获取请求信息的步骤中除了来自于Request,还有一部分来自于web.xml中的属性配置,通过ServletConfig对象来做。
获取 ServletConfig 对象 :this.getServletConfig();
获取 web.xml 中 servlet 的配置信息:ServletConfig 对象名.getInitParameter();
通过个性化配置,也实现了将当前Servlet部分动作与当前Servlet源文件进行解耦,只需要在xml配置文件中进行相关配置就会改变代码的执行效果。