Java面试题

来源:互联网 发布:python上位机 编辑:程序博客网 时间:2024/06/16 07:28

1.在网上商城系统中,如何实现购物车的功能?

   网上商城系统中的购物车与现实世界中的购物车具备相同的功能,用户可以在购物网站上的不同页面之间跳转,选取自己喜欢的商品。当用户选中某个商品时,就会将该商品添加到购物车中,以供用户之后的支付结算。当用户重复选购某个相同的商品时,可以将该商品的数量加1,以达到购买同种商品多个数量的目的。服务器通过追踪每个用户的动作,以保证在结账时每件商品都物有其主。

网上商城系统中的购物车具备如下几个功能:

1) 把商品添加到购物车中;

2)将商品从购物车中删除;

3)修改购物车中某件商品的购买数量;

4)清空购物车;

5)显示购物车中打算购买的商品具体信息;

OK.....接下来开始介绍该如何实现购物车的功能.......................

实现购物车的核心在于服务器能够识别每一个用户并维持与他们的联系。但是HTTP协议是一种基于请求/响应的无状态协议,也就是说此次请求过后,若浏览器再次发送请求给服务器,服务器则不记得上一次发送的是什么请求。那么,问题来了.......购物车中如何记住用户在不同页面中添加的商品的详细信息???

购物车的实现主要存在3种方式:cookiesession与数据库结合。下面详细介绍........

1.cookie

cookie是由服务器产生,存储在浏览器中的一段信息。读者可以理解为cookie是服务器写到浏览器中,保存在浏览器中的小纸条。它定义了一种Web服务器在浏览器中存储和返回信息的机制。cookie文件中包含域、路径、存活期和由服务器设置的变量值等内容。当用户以后访问同一个Web服务器时,浏览器会把cookie原样发送给服务器。通过让服务器读取原先保存到客户端的信息,网站能够为浏览者提供一系列的方便。如下图所示:


由以上介绍,即可以将用户选中的商品保存到cookie中,那么在进行支付结算的时候,即可读取cookie中的商品,进行结账。

用基于cookie的方式实现服务器与浏览器之间的会话或购物车,有以下特点:

        1)cookie存储在客户端,且占用很少的资源,浏览器允许存放300个cookie,每个cookie的大小为4KB,足以满足购物车的要求,同时也减轻了服务器的负荷; 

        2)cookie为浏览器所内置,使用方便。即使用户不小心关闭了浏览器窗口,只要在cookie定义的有效期内,购物车中的信息也不会丢失; 
        3)cookie不是可执行文件,所以不会以任何方式执行,因此也不会带来病毒或攻击用户的系统; 
        4)基于cookie的购物车要求用户浏览器必须支持并设置为启用cookie,否则购物车则失效; 
        5) 存在着关于cookie侵犯访问者隐私权的争论,因此有些用户会禁止本机的cookie功能。


2. session
        session是实现购物车的另一种方法。session提供了可以保存和跟踪用户的状态信息的功能,使当前用户在session中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问。它与cookie最重大的区别是,session将用户在会话期间的私有信息存储在服务器端,提高了安全性。在服务器生成session后,客户端会生成一个sessionid识别号保存在客户端,以保持和服务器的同步。这个sessionid是只读的,如果客户端禁止cookie功能,session会通过在URL中附加参数,或隐含在表单中提交等其他方式在页面间传送。因此利用session实施对用户的管理则更为安全、有效。

因此,利用session也能实现购物车,这种方式的特点是:

     1)session用新的机制保持与客户端的同步,不依赖于客户端设置;
      2)与cookie相比,session是存储在服务器端的信息,因此显得更为安全,可将身份标识,购物等信息存储在session中;
      3)session会占用服务器资源,加大服务器端的负载,尤其当并发用户很多时,会生成大量的session,影响服务器的性能;
      4)由于session存储的信息更敏感,而且是以文件形式保存在服务器中,因此仍然存在着安全隐患。

3. 与数据库结合

        这也是目前较普遍的模式。在这种方式中,数据库承担着存储购物信息的作用,session或cookie则用来跟踪用户。这种方式具有以下特点:
       1)数据库与cookie分别负责记录数据和维持会话,能发挥各自的优势,使安全性和服务器性能都得到了提高;
       2)每一个购物的行为,都要直接建立与数据库的连接,直至对表的操作完成后,连接才释放。当并发用户很多时,会影响数据库的性能,因此,这对数据库的性能提出了更高的要求;
       3)使用cookie维持会话,需要客户端的支持。


各种方式的简单比较:

        虽然cookie可用来实现购物车,但必须获得浏览器的支持,再加上它是存储在客户端的信息,极易被获取,所以这也限制了它存储更多更重要的信息。所以,一般cookie只用来维持与服务器的会话。例如国内最大的当当网络书店就是用cookie保持与客户的联系,但是这种方式最大的缺点是如果客户端不支持 cookie就会使购物车失效。
         session 能很好地与交易双方保持会话,可以忽视客户端的设置。在购物车技术中得到了广泛的应用,但session的文件属性使其仍然留有安全隐患
        结合数据库的方式虽然在一定程度上解决了上述问题,但从上面的例子可以看出:在这种购物流程中涉及到对数据库表的频繁操作,尤其是用户每选购一次商品,都要与数据库进行连接,当用户很多的时候就加大了服务器与数据库的负荷



2.在一个Java Web应用中,多个用户访问这个web应用,其中A用户已经登录了某个账号,现在,若B用户也想使用相同的账号登录,那么,当B用户登录的时候,就会将A用户挤掉,请问这个功能如何实现?

估计有很多种方法,但我目前就只想出这么一种来,后续如果还会其他方法会补充的.........


Java中为了共享数据会提供4个Map类型的数据结构,具体为:

application:对于整个web应用有效,一旦Java将数据放入application中,该数据将可以被该应用下的所有对象访问;

session:仅对一次会话有效,一次会话的有效期为浏览器与服务器建立连接时开始,关闭浏览器时结束。一旦Java将数据放入session中,则该数据将可以被本次会话的其他所有对象访问;

request:仅对本次请求有效,一旦Java将数据放入request中,该数据将可以被本次请求的其他对象访问;

page:仅对当前页面页面有效,一旦Java将数据放入page中,该数据只可以被当前页面的对象访问。

综上,这4个作用域的范围比较为:  application  >  session   >  request    >   page   


那么,该如何实现呢?

A用户登录:

1.获取登录的用户名和请求的SessionId;

2.把SessionId保存到application作用域中,而用户名保存到session作用域中;

B用户登录:

1.获取登录的用户名和浏览器中的SessionId;

2.在当前的session作用域中获取用户名对应的关键字,用关键字在application作用域里取得SessionId,将两者进行比较,不相等则调到登录。


0 0