HttpSession接口实现数据共享(1)

本文解析了Java面试中的核心概念,如Cookie和HttpSession在存储共享数据的区别,算法复习的重要性,以及Redis、MySQL、Kafka和网络基础知识。提供了详细的面试题解析、学习资源链接和实战项目源码。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

(3) 数据数量

一个Cookie对象只能存储一个共享数据,所以这也是为什么当我们去创建Cookie类型的变量的时候,变量名必须不一样。

HttpSession是使用map集合存储共享数据,所以可以存储任意数量共享数据,所以只需要使用会话域对象调用setAttribute方法即可。

(4)参照物

Cookie相当于客户在服务端【会员卡】

HttpSession相当于客户在服务端【私人保险柜】,放的比cookie多

三.代码实现

======

此处我们还是拿OneServelet和TwoServlet来举例:

同一个网站(myWeb)下OneServlet将数据传递给TwoServlet

首先在OneServlet中将数据存入到我们的session中

public class OneServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) {

//1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜

HttpSession session = request.getSession();

//2.将数据添加到用户私人储物柜

session.setAttribute(“key1”, 10);

}

}

浏览器访问/myWeb中T的woServlet,在TwoServlet中编写代码来获取我们的数据。

public class TwoServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) {

//1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜

HttpSession session = request.getSession();

//2.从会话作用域对象得到OneServlet提供的共享数据

Integer num = session.getAttribute(“key1”);

System.out.println(“获取到的共享数据值为=”+num);

}

}

当然假如我们的用户在获取共享数据的时候不想去使用包装类强转,想使用我们的基本数据类型强转也可以,此时就需要用到一个方法叫做getAttributeNames方法,这个方法可以获取到我们session中使用map集合存储共享数据时的key值,下面来看具体的代码实现吧:此处只需要重写我们TwoServlet中的代码即可。

public class TwoServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜

HttpSession session = req.getSession();

//2.从会话作用域对象得到OneServlet提供的共享数据

Enumeration keynames=session.getAttributeNames();

while(keynames.hasMoreElements()){

//获取到map集合中的每一个key值

String eachkeyname=(String)keynames.nextElement();

int eachvalue=(int)session.getAttribute(“key1”);

System.out.println(“key值为”+eachkeyname+“value值为”+eachvalue);

}

}

}

注意事项:

1:当我们使用getAttributeNames获取我们存入到map集合中的所有数据的时候,这个方法的返回值是一个枚举对象,所以需要将我们所获取的所有key值赋给我们的枚举对象。

2:当获取到所有的key值时,下一步需要使用while循环来遍历我们的枚举对象,方法为hasMoreElements()。

3:循环内部首先需要获取每一个具体的key值,那么就需要使用我们的nextElements()方法来获取,注意nextElements()方法的返回值为Object,所以此处涉及到我们的强转,假设之前我们的key值类型为String,那么此处的强转类型便为String.

4:当获取到我们的key值后,此时就需要获取我们的value值,获取方式还是使用我们的Httpsession对象的属性getAttribute方法,getAttribute方法的返回值仍为Object,所以此时获取我们的value值时仍然涉及到我们的强转,因为在OneServlet中我们存储的时候的value值为整形,所以此处的强转类型为int即可。

🆗,说到这里,一个问题戛然而生,之前我们在使用getAttribute方法获取整形类型的共享数据的时候,我们的强转类型为Integer,为什么当我们使用getAttributeNames方法后,此处当我们获取到我们的整型类型的共享数据的时候,我们的强转类型就变为了int呢?

首先先来看之前我们没有使用getAttributeNames的时候,此时假如用户给我们的key1赋了一个null值,然后在另一端接收的时候用户并不知道这个数据是否为null,假如此时不使用包装类进行强转,使用基本类型去进行强转,就会发生空指针异常,因为基本数据的默认值例如int为0,而其包装类Integer的话默认值为null,所以此时使用int进行强转的话,就相当于将null赋值给基本数据类型int,那么就会发生空指针异常,但是包装类就不会发生,因为其是可以存储null的。

一般在实际开发中我们都会拿包装类来进行传参,因为是可以进行

当我们使用getAttributeNames后,此时就相当于一个一个的从Map集合中将key值取出来,此时的key值都是有明确的value值与之对应的,所以不会发生空指针异常,那么即使在获取整形的value值时使用了基本数据类型进行强转也不会发生任何异常。

4.Http服务器如何将用户与HttpSession关联起来?

===============================

答案当然是使用cookie来进行连接,下面我们来看一张图来进行理解:

当用户第一次访问OneServlet的时候,会在OneServlet中使用请求对象代替Tomcat索要当前的HttpSession对象,在服务器端内部,我们的Tomcat会自动为每一个HttpSession对象设置一个编号(箱号),名为JSESSIONID,当我们在OneServlet中使用setAttribute方法存储数据到我们的HttpSession对象后,此时我们的HttpSession对象便会直接放在我们的Http服务器端,然后将我们的编号JSESSIONID放入到我们的cookie当中,再将我们的cookie放入到http响应协议包的响应头中返回给我们的浏览器,存在我们浏览器的缓存中,如上图所示。

当同一用户在同一网站下第二次访问TwoServlet时,此时发给TwoServlet的请求协议包中便会放入我们之前所收到的来自服务器端的cookie,这个cookie被放入了请求协议包中的请求头中,然后此时服务器端接收到我们的浏览器请求后,tomcat会根据cookie当中的JSESSIONID来判断当前用户是否之前索要到了HttpSession对象以及哪个HttpSession对象是当前这个用户的,从而就找到了之前这个用户第一次请求时在session中用于存储的数据HttpSession对象,然后就可以使用getAttribute方法来获取到数据了。

五.getSession()  与  getSession(false)的区别

=======================================

1.getSession()

如果当前用户在服务端已经拥有了自己的私人储物柜.要求tomcat将这个私人储物柜进行返回.

如果当前用户在服务端尚未拥有自己的私人储物柜,要求tocmat为当前用户创建一个全新的私人储物柜.

总结

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。

  • 第一个是算法

关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。

而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本

《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

《算法的乐趣》共有23个章节:

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

[外链图片转存中…(img-rEVRETSB-1714644461992)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值