一、Cookie
在学习Cookie之前,我们先写一下,一个servlet类里,重写父类service方法的具体步骤:
1 service() 2 { 3 //设置请求编码格式 4 //设置响应编码格式 5 //获取请求信息 6 //获取cookie数据 7 //处理请求信息 8 //响应处理结果 9 //创建cookie数据 10 //响应cookie数据 11 //(1)直接响应 12 //(2)请求转发到其他servlet类 13 //(3)重定向 14 }
大家对cookie可能满心疑问,不要着急,我们现在就来弄懂Cookie!
1.问题:
不同的请求使用相同的请求数据, 但是只要请求结束,数据就被销毁了, 其他请求需要将公共数据重新发送; 这样,每次都要重新填写数据,非常麻烦!有没有什么好办法,把经常需要填写的数据,存储起来呢?
2.解决:
有,那就是使用cookie技术!
3.特点:
(1)服务器指挥, 浏览器端数据存储;
(2)那些数据需要被存储是在服务器端进行声明的, 以响应的方式告诉浏览器;
(3)不设置有效期浏览器关闭就会失效;
(4)不适合的大量数据的存储;
4.作用:
解决了不同请求之间数据共享的问题。
5.cookie有效期:
cookie有效期可以单独设置,如果不设置默认保存在电脑内存中, 浏览器一旦关闭, cookie数据就将被销毁;
可以使用cookie.setMaxAge()来设置cookie的有效期,这样,cookie就保存在了电脑硬盘中,就算浏览器关闭,cookie数据也不会被销毁;
6.cookie有效路径:
cookie.setPath("/虚拟项目名/**/);
如果不给cookie设置路径, 那么浏览器访问什么页面都会带上cookie数据,这样在一定程度上会让请求响应服务有延迟,影响用户体验;
而我们只要设置cookie数据,那么,浏览器只有访问这个URL时,才会带上cookie数据;
二、Cookie代码实现
1.
第一次请求,我们要在LoginServlet类中创建Cookie数据。
2.
然后我们打开浏览器,输入: localhost:8080/”虚拟项目名“/LoginServlet?a=a1&b=b1
检查一下响应头,我么们就可以发现,我们设置了set-cookie:b = b1;(服务器指挥,浏览器创建;)
3.
编写ServletC这个类,让这个类获取已经被浏览器存储的cookie数据。
获取cookie数据,记住要使用getCookies()方法,而不是getParameter()方法!
4.
然后我们打开浏览器,输入: localhost:8080/”虚拟项目名“/LoginServlet?c=c1。
这个时候,我们就可以看到,浏览器已经把cookie放在请求头中了。
三、Session:
cookie虽好,但是cookie数据是储存在浏览器端的。当需要cookie存储的数据非常大的时候,将会严重影响浏览器的运行效率!
那么有没有其他办法存储共享数据呢?
有,那就是基于cookie技术的sesssion技术。
简单来说呢,就是服务器为每个servlet类创建一个session锁(锁里面有数据),这个锁放在服务器上,这个锁对应的钥匙用cookie技术实现,然后放在浏览器上;
浏览器再次请求服务器时,在请求头上,带上cookie钥匙,去打开对应的session锁,获取数据!
2.session的流程
(1)浏览器发送请求到servletA中,然后服务器调用rep.getSession()方法获取session对象,如果此次请求中,浏览器的cookie没有携带sessionID,则服务器创建新的session对象;如果携带了,则服务器则会检查此sessionID对应的session对象是否被销毁;
如果被销毁,则服务器创建新的session对象;如果未被销毁,则服务器把session对象返回;
(2)在session中存储数据、获取或删除数据;
或者销毁session;
3.session的有效期:
设置session的有效期有三种方式
- 1)session.setMaxInactiveInterval(int seconds);
- 2)在当前程序的web.xml中配置session-config ;
- 3)在Tomcat的/conf/web.xml中配置session-config;
- 1)Session 技术,是依赖 Cookie 技术和服务器端的数据存储技术。
- 2)由服务器端进行创建每个用户,独立拥有一个 session默认存储时间为 30分钟。浏览器不关闭,则session不失效,则同一请求的所有session都是同一个,数据都是一样的。
- 3)我们创建好session后,应该把sessionID存储到cookie中,让浏览器存起来,但是这个动作我们不需要做,session的底层自动帮我们实现了。
四、Session代码实现:
1.如何创建session对象?
2.如何获取session对象的数据?
3.SerlvetD创建了session,那么ServletE如何根据sessionID获取session呢?
(和创建session对象的代码一样;这也证明了:
如果此次请求中,浏览器的cookie没有携带sessionID,则服务器创建新的session对象;如果携带了,则服务器则会检查此sessionID对应的session对象是否被销毁;
如果被销毁,则服务器创建新的session对象;如果未被销毁,则服务器把session对象返回;)
4.如何设置session数据?