![9bc1202100bc9a5fcd9fddb4949da553.png](https://i-blog.csdnimg.cn/blog_migrate/69ef382e5db32f6680ce6089ede6e2d6.jpeg)
1、首先是请求转发的request问题
![62cffa2002174afb912ae5ffd88d6460.png](https://i-blog.csdnimg.cn/blog_migrate/c184854542b3cb8ab39d39d605ef0548.jpeg)
请求转发,其实就是在一个Servlet中调用其他的Servlet,如上面的图我们可以看出,是同一个请求,在服务器中进行跳转,浏览器不知道,地址栏的信息是不会变的,request的作用域在A和B中都能使用,request的作用域是一次请求转发内的servlet中
问题:不同的请求使用相同的请求数据,但是请求只要结束,数据就被销毁了,其他的请求需要将公共数据重新书写发送,例如怎么能像QQ登录一样有记住密码的功能,不需要我们再输入一遍密码呢?
2、使用Cookie
![503826f0c3d7841b0c8193d9ce38331b.png](https://i-blog.csdnimg.cn/blog_migrate/1e10780821ad8296068191bb821bebef.jpeg)
Cookie的作用:解决了不同请求之前请求数据共享的问题
Cookie的特点:浏览器端的数据存储技术,哪些数据需要被存储是在服务器端进行声明,以响应的方式告诉浏览器进行存储,不适合大量数据的存储。
上图所示:请求1的响应,告诉浏览器将其他请求会需要的数据保存下来,并再其他请求中附带上保存的数据
注意:
![6c1221219b18e91fdd039f2d68320c37.png](https://i-blog.csdnimg.cn/blog_migrate/be10a37354e9b49f39003e8f807d5bcd.jpeg)
注意:
如果不设置有效期则默认存储在浏览器的内存里,浏览器关闭即失效。
如果设置了有效期,则存储到客户端的硬盘里,到期后自动销毁。
如果不设置有效路径,则任意项目路径的请求都会附带存储的Cookie信息
如果设置了有效路径则只有在该路径下的请求才会附带设置的Cookie信息
问题:
一个用户不同的请求在处理的时候需要使用其他请求中的数据该怎么办?
![955c9377da887db340b3fda4070134f5.png](https://i-blog.csdnimg.cn/blog_migrate/81c346a71cd2935d70bc72d9dd1cf95f.jpeg)
解决:
3、 session技术
如何使用session:
1、创建session对象
HttpSession session =req.getSession();
2、存储数据到session中
session.setAttribute(String name, Object value);
3、获取session对象
HttpSession session =req.getSession();
4、获取session中的数据
session.getAttribute(String uname);注意:返回的object类型,需要强制转换
5、删除session中的数据
session.removeAttribute(String uname);注意:如果有数据则删除,没有则什么都不做。
流程:
1、 浏览器发起请求到Aservlet,在AServlet中使用req.getSession()获取Session对象,如果此次请求中没有SessionID则创建一个新的Session对象,如果有SessionID则将其对应的Session对象返回(前提是该session对象没有到期),如果session对象到期销毁了,就算有sessionID也会重新创建一个Session。
2、 校验session是否失效,存储数据到session对象中或者获取session中的数据或者删除session中的数据
特点:
1、session解决了同一个用户不同请求 的数据共享问题。
2、session的作用域:浏览器不关闭,session不失效,则同一用户的任意请求获取的都是同一个session, 一次会话
session的设置:
session默认有效时间为30分钟,可以在tomcat下的web.xml中进行配置,注意:此种配置方式是所有的tomcat下的项目默认为30分钟
也可以在代码中使用如下代码设置:
session.setMaxInactiveInterval(int seconds);//设置session的有效时间,参数为整数类型的秒
销毁session:
session.invalidate();//强制销毁session
问题:如何让不同用户之间的数据共享问题呢?
4、使用ServletContext
它是由服务器创建的,所有用户共享
获取ServletContext对象的3种方式
在service()方法中:
a)、ServletContext sc=this.getServletContext();
b)、ServletContext sc=this.getServletConfig().getServletContext();
c)、ServletContext sc=request.getSession().getServletContext()
存储用户共享的数据
sc.setAttribute(String name,Object value);
获取用户共享数据
sc.getAttribute(String name)
删除共享数据
sc.removeAttribute(String name)
可以在web.xml中配置全局配置属性:
![eb915da78d7762d2fe612a3831e141a7.png](https://i-blog.csdnimg.cn/blog_migrate/ed311d2bb9f3d94beb51320b66618de3.png)
可以通过ServletContext对象获取全局配置属性:
sc.getInitParameter(String name);
获取WebRoot下的资源流对象
sc.getResourceAsStream(String path)
注意:
path为相对路径,写从webRoot开始查找资源的路径即可。
![6e6eefa6d51a005af196fadd9fc01d1f.png](https://i-blog.csdnimg.cn/blog_migrate/6509aab84babdf6da7735c9bf277f2c6.png)
获取webRoot下的资源绝对路径
sc.getRealPath(String path);
注意:
path为相对路径,写从webRoot开始查找资源的路径即可。
统计一个网页的访问记录,我们可以使用ServletContext来保存计数器,但是服务器一关闭,我们的ServletContext就销毁了,计数器也就不见了,如何让重启服务器之后,还能知道该网页的访问记录呢?
//在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
//在服务器启动的时候将nums.txt中的数据存储到ServletContext中
NumServlet初始化的时候
![1fe867e5278f97765da3fda2200b714c.png](https://i-blog.csdnimg.cn/blog_migrate/e7703aaffc2c45016f217a20151fed08.jpeg)
NumServlet销毁的时候(也就是关闭服务器的时候)
![51c22e8442b88f1dda5cdf44b06fba2d.png](https://i-blog.csdnimg.cn/blog_migrate/16ab5b03a4bd492e4b20799fa48e7c32.jpeg)
不要忘记在web.xml中配置
![afd95926c39a5d3730f0445646cce00d.png](https://i-blog.csdnimg.cn/blog_migrate/9bd8975c98e82c3557578d450b3bd993.jpeg)
5、ServletConfig
它是单个Servlet所拥有,相当于一个老板的单独的秘书,嘿嘿,有事秘书干,没事干......
![8cab54d0b1ac05ac6b4baa85494b4f1b.png](https://i-blog.csdnimg.cn/blog_migrate/2aee22db877fadbb23c37e11bfd47d53.jpeg)
![4124dbef3e32a04722e099dbe7f60875.png](https://i-blog.csdnimg.cn/blog_migrate/8aeb85a7adcb9b285fb312cd31247f9d.jpeg)