1 cookie学习
(1)cookie的作用
为了解决不同请求之间数据共享的问题
(2) cookie的特点
数据的声明是在服务器端,真正的存储是在浏览器端
(3)服务器向客户端写入cookie方式:
String p=req.getParameter(“pp”);
Cookie c=new Cookie(“pp”,p);//创建cookie对象
resp.addCookie(c);//响应cookie数据
(4) 服务器读取客户端所有cookie
Cookie[] temp=req.getCookies();//得到的是一个Cookie类型的数组
for(Cookie str:temp){
if((str.getName()).equals("bb")){//对其遍历得到所有cookie对象 b=str.getValue();
}
}
下面是实例:
2 Session的学习
(1)Session的作用
session解决了同一个用户不同请求 的数据共享问题。
(2)Session的原理
用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中(临时存储,浏览器关闭即失效)。
用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象.
(3)Session的特点
1)Session 技术是依赖 Cookie 技术的服务器端的数据存储技术。
2)由服务器进行创建
3)每个用户独立拥有一个 session
4)默认存储时间为 30 分钟
(4)session的作用域:一次会话
注意: 浏览器不关闭,session不失效,则同一用户的任意请求获取到的都是同一个session 对象
(5)使用方式:
1)创建session对象 <来获得sessionID>
HttpSession session = req.getSession();
2)存储数据到session对象中
session.setAttribute(String name, Object value);
3)获取session对象 <这个获取对象是(1)已经创建过对象拥有了sessionID的
HttpSession session = req.getSession();
4)获取session中的数据
session.getAttribute(String name); 注意:返回的object类型,需要强制转换
5)删除session中的数据
session.removeAttribute(String uname);注意:如果有数据则删除,没有则什么都不做。
(6)流程
1、 浏览器发起请求到Aservlet,在AServlet中使用req.getSession()获取Session对象,如果此次请求中没有SessionID则创建一个新的Session对象,如果有SessionID则将其对应的Session对象返回(前提是该session对象没有到期),如果session对象到期销毁了,就算有sessionID也会重新创建一个Session。
2、 校验session是否失效,存储数据到session对象中或者获取session中的数据或者删除session中的数据
(7)1. session的有效期设置和强制销毁
1)session的默认有效期以及设置session的有效期
默认有效时间为30分钟;
session.setMaxInactiveInterval(5);//设置 有效期时间为5s.
注意:此种配置方式是所有的tomcat下的项目默认为30分钟
2) 强制销毁session
session.invalidate();
注意:强制销毁时,请求头中仍然含有上一次被销毁的sessionID
实例:
ServletB
ServletA
下面详细看一下一篇博客的总结: (学习的作者:瑾兰
来源:CSDN
原文:https://blog.csdn.net/qq_28296925/article/details/80921585
版权声明:本文为博主原创文章,转载请附上博文链接!)
在这里非常感谢作者瑾兰给予的帮助
一、客户端与服务端请求响应的关系
USER(客户端) 请求 tomcat(服务器), 属于HTTP请求。http请求是无状态的,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;所以当用户从客户端请求一次登录后,登录成功,再次进行请求时,因为tomcat不能识别这两次会话都是来自同一个浏览器,即服务端不知道客户端的历史请求记录;就会再次弹出登录对话框。
为了解决客户端与服务器会话同步问题,就引出了下面结果概念: cookie和session
二、cookie是什么
一个HTTP cookie的(网络Cookie,浏览器cookie)是一小片数据的一个服务器发送到用户的网络浏览器。浏览器可以存储它并将其与下一个请求一起发送回同一服务器。通常,它用于判断两个请求是否来自同一个浏览器 - 例如,保持用户登录。它记住无状态 HTTP协议的有状态信息。
三、session是什么
客户端请求服务端,服务端(Tomcat)会为这次请求开辟一块内存空间,这个对象便是Session对象, 存储结构为ConcurrentHashMap。
session的目的:弥补HTTP无状态特性,服务器可以利用session存储客户端在同一个会话期间的一些操作记录。
四、HTTP是无状态的
在同一连接上连续执行的两个请求之间没有链接。对于试图与某些页面连贯地相互作用的用户而言,这立即存在问题,例如,使用电子商务购物篮。但是,虽然HTTP本身的核心是无状态,但HTTP cookie允许使用有状态会话。使用标头可扩展性,HTTP Cookie被添加到工作流中,允许在每个HTTP请求上创建会话以共享相同的上下文或相同的状态。
五、session的实现机制
1、服务器如何判断客户端发送过来的请求属于同一个会话?
用session id区分;session id 相同即认为是同一个会话;
在tomcat中session id中用JSESSIONID来表示;
2、服务器、客户端如何获取sessionID?SessionID在期间是如何传输的?
服务器第一次接收到请求时,开辟了一块Session空间(创建了Session对象),同时生成一个Session id,并通过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应; 客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;
接下来客户端每次向同一个网站发送请求时,请求头都会带上该cookie信息(包含Session id); 然后,服务器通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此次请求的Session id;
注意:服务器只会在客户端第一次请求响应的时候,在响应头上添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,接下来在同一个会话的第二第三次响应头里,是不会添加Set- Cookie:“JSESSIONID=XXXXXXX”信息的; 而客户端是会在每次请求头的cookie中带上JSESSIONID信息;
上面当第二次请求时,明明是同一个客户端请求,之前已经登录,第二次仍然需要当做全新的请求
所以,这样的用户体验会很差.
问题就在于: 不能同步会话
本质原因: HTTP请求无状态的
解决方法: cookie中存入sessionID
通过前面知识点的学习,我们对于请求的处理已经可以说比较灵活了,但是还不够。我们再介绍两个重要的对象 ServletContext 对象和 ServletConfig 对象
3 ServletContext 对象:
(1) ServletContext对象的作用
Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享就需要用ServletContext对象解决
(2)原理
ServletContext 对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。
(3)特点:
1)服务器进行创建
2)用户共享
3)一个项目只有一个
(4)生命周期: 服务器启动到服务器关闭
(5)作用域: 项目内
(6)使用方法:
1)创建ServletContext对象(有三种方式)
ServletContext sc1 = this.getServletContext();
ServletContext sc2 =this.getServletConfig().getServletContext();
ServletContext sc3=req.getSession().getServletContext();
2)存储用户共享数据
sc.setAttribute(String name,Object value);
3)获取用户共享数据
sc.getAttribute(String name);
4)删除共享数据
sc.removeAttribute(String name);
5)获取web.xml中的全局配置属性,作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。
sc.getInitParameter(String name);注意返回的是String类型数据
6)获取webRoot下的资源流对象
sc.getResourceAsStream(String path);
注意:path为相对路径,写从webRoot开始查找资源的路径即可。
7)获取webRoot下的资源绝对路径
sc.getRealPath(String path);
注意:path为相对路径,写从webRoot开始查找资源的路径即可。
示例如下:
ServletContextA
ServletContextB
4 ServletConfig 对象
(1) ServletConfig对象的作用
使用ServletContext对象可以获取web.xml中的全局配置文件,在 web.xml 中 每个 Servlet 也可以进行单独的配置,那么就需要用到 ServletConfig对象进行配置
ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信息。
(2)使用方法:
获取 ServletConfig 对象
获取 web.xml 中 servlet 的配置信息