session共享作用_Java修行第055and056天---cookie和session以及Context和Config

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();

}

}

下面是实例:

a90aced3fe23894e1b30bad10ed5c6ed.png

29a7d896cd97d8ab5c899d8451f3c36f.png

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

620ce3d7135984d10217f05f1b95b171.png

ServletA

59be1628da15af222dc471fdfed46550.png

下面详细看一下一篇博客的总结: (学习的作者:瑾兰

来源:CSDN

原文:https://blog.csdn.net/qq_28296925/article/details/80921585

版权声明:本文为博主原创文章,转载请附上博文链接!)

在这里非常感谢作者瑾兰给予的帮助

一、客户端与服务端请求响应的关系

USER(客户端) 请求 tomcat(服务器), 属于HTTP请求。http请求是无状态的,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;所以当用户从客户端请求一次登录后,登录成功,再次进行请求时,因为tomcat不能识别这两次会话都是来自同一个浏览器,即服务端不知道客户端的历史请求记录;就会再次弹出登录对话框。

05183656aa76c1557239f72def44d18d.png

为了解决客户端与服务器会话同步问题,就引出了下面结果概念: 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信息;

df64dec4544494175ae6ef703a71e13b.png

上面当第二次请求时,明明是同一个客户端请求,之前已经登录,第二次仍然需要当做全新的请求

所以,这样的用户体验会很差.

问题就在于: 不能同步会话

本质原因: HTTP请求无状态的

解决方法: cookie中存入sessionID

23526f53098d1d79b58f643166f658ab.png

125e352560cc77e65c863e8703f1b9dd.png

通过前面知识点的学习,我们对于请求的处理已经可以说比较灵活了,但是还不够。我们再介绍两个重要的对象 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

d00c4d9ed8f909eb420f1cbd33488f84.png

ServletContextB

dd1fc3cf7e4da791a32df4568abeab0d.png

4 ServletConfig 对象

(1) ServletConfig对象的作用

使用ServletContext对象可以获取web.xml中的全局配置文件,在 web.xml 中 每个 Servlet 也可以进行单独的配置,那么就需要用到 ServletConfig对象进行配置

ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信息。

(2)使用方法:

获取 ServletConfig 对象

获取 web.xml 中 servlet 的配置信息

96f52adf63e1b404eaa754e7ce5a183e.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值