范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java统计用户在线人数,这样做才优雅

  统计用户在线人数
  在统计用户在人数的时候,我们用到了监听器,监听器大致分为以下三种: ServletRequestListener :用于监听请求的监听接口HttpSessionListener :用于监听会话的监听接口ServletContextListener :用于监听应用的回话接口错误的统计办法监听Request域
  这种统计办法是错误的认为每次刷新页面后进行进行一次的 count++ 运算import javax.servlet.*; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionBindingEvent;  @WebListener() public class MyRequestListener implements ServletRequestListener{     private ServletContext sc;     private Integer count;     @Override     //请求被初始化 Request     public void requestInitialized(ServletRequestEvent sre) {         //获取全局域         sc = sre.getServletContext();         //将count从全局域中获取出来         count = (Integer) sc.getAttribute("count");         System.out.println(count);         count++;         System.out.println(count);         sc.setAttribute("count",count);     } } import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionBindingEvent;  @WebListener() public class MyServletContextListener implements ServletContextListener{     private ServletContext sc;     @Override     //Application被初始化的时候创建     public void contextInitialized(ServletContextEvent sce) {         Integer count = 0;         //获取全局域         sc = sce.getServletContext();         //将count放入到全局域中         sc.setAttribute("count",count);     } } <%@ page contentType="text/html;charset=UTF-8" language="java" %>         $Titlelt;/title>   </head>   <body>   <center><h1>You are the ${applicationScope.count} customer to visit. </h1></center>   </body> </html>
  这种错误地做法导致的是每刷新一次页面 就会导致count进行累加操作,最终产生错误的在线人数,所以此时想到不应该监听Request域,而应该监听Session域。 监听Session域
  在第二次监听Session域之后,发现每次刷新页面后不改变count但是在启动不同的浏览器后 count++ 会实现,但是,这样做并不是我们要统计的在线人数,所以此种做法错误。由于代码只是将原来写在Request监听器中的代码转移到Session监听器中,所以其他没变的代码将不重复。import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionBindingEvent;  @WebListener() public class MySessionListener implements HttpSessionListener{      private ServletContext sc;     private Integer count;      @Override     //当对话产生时激活此方法     public void sessionCreated(HttpSessionEvent se) {         sc = se.getSession().getServletContext();         count = (Integer) sc.getAttribute("count");         count++;         sc.setAttribute("count",count);     } }
  这时我们发现对于在线人数的统计,不是网页访问的次数,也不是浏览器打开的个数,对需求的理解的错误理解。所以正确的做法是统计其IP的数量,这样的话,不管你在一台电脑上开启多少客户端,都会只有一个。 正确的统计方法
  统计其IP的数量,将IP的数量作为当前的在线人数,那么如何统计IP的数量呢?这样将会导出以下问题: 如何获取用户的IP? IP将如何存储? 如何判断IP之前已经存在?
  现在来解决这些问题: 只能从请求中获取 通过2、3问题,我们想到了集合(List),因为集合不仅可以存储任何字符串,还可以通过遍历来判断之前是否有重复的IP出现。
  到了这里又冒出来一个问题集合(List)放到哪个域里呢?
  ServletContext域 import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionBindingEvent; import java.util.ArrayList; import java.util.List;  @WebListener() public class MyServletContextListener implements ServletContextListener{     private ServletContext sc;      @Override     //Application被初始化的时候创建     public void contextInitialized(ServletContextEvent sce) {         //创建一个链表来存储IP         List<String> ips = new ArrayList<>();         sc = sce.getServletContext();         //将创建好的链表对象,放到Application域中         sc.setAttribute("ips",ips);     } }
  由于IP只能在Request域中获取,所以遍历判断在Request域中进行。 import javax.servlet.*; import javax.servlet.annotation.WebListener; import javax.servlet.http.*; import java.util.List;  @WebListener() public class MyRequestListener implements ServletRequestListener{      private HttpServletRequest sr;     private String clientIp;     private ServletContext sc;     private List<String> ips;     private HttpSession session;      @Override     //请求被初始化 Request     public void requestInitialized(ServletRequestEvent sre) {         //从请求域中获取IP         sr = (HttpServletRequest) sre.getServletRequest();         clientIp = sr.getRemoteAddr();         session = sr.getSession();         session.setAttribute("clientIp",clientIp);          //测试         // System.out.println("clientIp = "+ clientIp);         //获取Application域中的List         sc = sre.getServletContext();         ips = (List<String>) sc.getAttribute("ips");         //遍历ips         for (String ip :                 ips) {             if (clientIp.equals(ip))                 return;         }         ips.add(clientIp);         sc.setAttribute("ips",ips);     } }
  因为要统计在线人数,所以要设置退出按钮,点击退出按钮之后,因为要从List域中移除,所以使用Session域监听器来判断session回话的关闭 import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.*; import java.util.List;  @WebListener() public class MySessionListener implements HttpSessionListener{      private ServletContext sc;     private List<String> ips;     private HttpSession session;     private Object clientIp;      @Override     public void sessionDestroyed(HttpSessionEvent se) {         sc = se.getSession().getServletContext();         ips = (List<String>) sc.getAttribute("ips");         session = se.getSession();         clientIp = session.getAttribute("clientIp");         //删除ip,如何获取IP,但是不可以从session获取到IP         //因为Session获取不到Request         //一个Session包含多个Request         //一个Request只对应一个Session 所以获取不到,这时只能先从Request域中获取到的ips,放置到Session域         //然后从Session 域中读取         ips.remove(clientIp);         // session一失效就马上将此IP从链表中移除是错误的         //应该看此IP是否有另外的回话存在,如果有的话不能删除     } }
  此处代码是页面点击关闭后,激活的退出方法 import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;  @WebServlet(name = "LogoutServlet",urlPatterns = "/logoutServlet") public class LogoutServlet extends HttpServlet {      private HttpSession session;      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         //从域中获取一个session,设置为false 如果域中存在一个session,则直接获取,如果不存在,则返回一个空的session         session = request.getSession(false);         if (session != null){             //使session失效             session.invalidate();             //失效后,需要进行的操作,List链表中需要减去,用到了Session域监听器         }     }      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         doPost(request,response);     } }
  在jsp页面进行读取的时候,因为ips是以List链表的形式存在的,所以要想判断当前在线人数,所以必须要判断链表的长度,所以是 applicationScope.ips.size() <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html>   <head>     <title>$Titlelt;/title>   </head>   <body>   <center><h1>You are the ${applicationScope.ips.size()} customer to visit. </h1>
  <h3>       安全退出     </h3>   </center>   </body> </html>
  好了?,这时候,程序写完了,如何判断呢?
  此时,我们的程序是部署在本地的Tomcat上的,对于本台电脑,只有一个IP,如何实现多个IP呢?其实啊我们的电脑可以有三个IP,在访问服务器的时候,服务器的IP多写几个,相当于本机的IP多出来几个。是哪三个IP呢?
  1、默认clientIp : 0:0:0:0:0:0:0:1
  2、127.0.0.1
  这时大家可能会问127.0.0.1和localhost有什么区别呢,其实在这里要区分三个概念:
  localhost、127.0.0.1 和 本机IP之间的区别: localhost等于127.0.0.1,不过localhost是域名,127.0.0.1是IP地址。 localhost和127.0.0.1不需要联网,都是本机访问。 本机IP需要联网,本机IP是本机或外部访问, 本机 IP 就是本机对外放开访问的IP地址,这个网址就 是与物理网卡绑定的IP地址。
  3、IPv4地址:192.168.1.110
  这样就很完美的实现了本地三个IP的测试。
  写到这里,似乎已经可以简单的测试当前在线人数,也许仔细的人会发现在Session域被销毁的方法中的注释中发现一些猫腻。大家可以仔细想想,如果客户端用不同的浏览器,相同的IP去访问呢?点击退出后,会不会出现错误情况呢?答案是会的。演示结果如下图
  最完美的代码
  所以在点击退出登录的按钮之后,不可以直接将IP移除,要判断有没有另外的回话存在,如果有另外的回话存在,此IP是不可以删掉的,问题由此变的复杂了,因为还要统计此IP所发出的会话有多少。
  整体思路:
  在全局域中,将不是直接将iP存放在List的链表中,而是以一个Map的形式存在,Map的键为String类型,Key为List类型,List中存放的是当前IP所激发的会话对象,这样就可以统计,一个IP触发的sessions有多少个。
  通过调用Map的get方法,将当前IP最为参数,将可以获取到他所激发的会话集合。但是,此集合可能为空,因为有可能当前IP一次也没有访问此页面,所以在List为空的时候好要创建一个ArrayList来存放sessions,然后将变化后的List重新写回到Map,再将变化后的Map写回到全局域中 。这样创建过程基本完成。
  然后考虑销毁过程,IP还需方法放到Session域中,当session被销毁的时候,应该把当前Session从List 中删除,但是Map中此sessions对应的IP可是不能直接删,要判断List中的sessions的个数(Entry对象),个数为1的时候才可以删除,不然就不可以删除。
  所以,要将当前IP通过Request域存放到当前Session域中,
  然后,要考虑的问题是,每次刷新页面后sessions的个数会增加,这是错误的,原因是什么?
  答案是,因为在存放sessions的时候,创建数组直接进行的添加,这样的话,每次一刷新页面,就会导致sessions的添加,所以在此之前应该判断,sessions中是否有此session,有的话直接跳出。
  这样添加就没问题了 Servlet域中添加Map
  在Map中,需要使用键值对的方式,Key为IP,Value为List,那么List中存放什么呢?存放的是此IP发出的所有回话的HttpSession的对象,所以List的泛型是HttpSession。
  请求,在请求中,因为将当前Session 对象存放到List中, List在Map中,Map在全局域中,所以首先得从全局域获取到Map,然后,从Map中获取由当前IP所发出的所有Session的组成的List,判断当前的List是否为NULL,若为NULL,则创建List,否则,将当前SessioncurrentSession放入List中。 import javax.servlet.*; import javax.servlet.annotation.WebListener; import javax.servlet.http.*; import java.util.ArrayList; import java.util.List; import java.util.Map;  @WebListener() public class MyRequestListener implements ServletRequestListener{      private HttpServletRequest sr;     private String clientIp;     private ServletContext sc;     private List<String> ips;     private HttpSession currentSession;     private Map<String,List<HttpSession>> map;     private List<HttpSession> sessions;       @Override     //请求被初始化 Request     public void requestInitialized(ServletRequestEvent sre) {         //从请求域中获取IP         sr = (HttpServletRequest) sre.getServletRequest();         clientIp = sr.getRemoteAddr();         currentSession  = sr.getSession();         //将当前Session 对象存放到List中, List在Map中,Map在全局域中,         sc = sre.getServletContext();         map = (Map<String, List<HttpSession>>) sc.getAttribute("map");         //从Map中获取由当前IP所发出的所有Session的组成的List         sessions = map.get(clientIp);         //判断当前的List是否为NULL,若为NULL,则创建List,否则,将当前Session放入List         if (sessions == null){             sessions = new ArrayList<>();         } //        遍历List的session 对象,若有则不添加,若没有则添加         for (HttpSession session :                 sessions) {             if (session == currentSession)                 return;         }         sessions.add(currentSession);           //将变化过的List重新写回到Map         map.put(clientIp,sessions);         //再将变化的Map写回到全局域中         sc.setAttribute("map",map);          //将当前IP放入到当前Session         currentSession.setAttribute("clientIp",clientIp);     }  } ServletContext
  这里将不使用ips了,所以将其删除 import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;  @WebListener() public class MyServletContextListener implements ServletContextListener{     private ServletContext sc;     @Override     //Application被初始化的时候创建     public void contextInitialized(ServletContextEvent sce) {         //创建一个Map,key为IP,value为该IP上所发出的会话的对象         Map<String,List<HttpSession>> map = new HashMap<>();         sc = sce.getServletContext();         //将map放到全局域中         sc.setAttribute("map",map);     } } Session监听器
  接下来剖析Session的删除工作,获取当前Session对象,这里有之前传递过来的IP,在进行删除操作的时候,要注意此处,删除的是List中的sessions,删除之后,还要判断其IP的是否要删除,如果List中没有该元素,则说明当前IP所发出的会话全部关闭,就可以从map中将当前IP对应的Entry对象删除,否则,当前IP所发出的会话任存在,那么使用put方法将变化过的List写回到map。 import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.*; import java.util.List; import java.util.Map;  @WebListener() public class MySessionListener implements HttpSessionListener{      private ServletContext sc;     private List<String> ips;     private HttpSession currentSession;     private String clientIp;     private Map<String,List<HttpSession>> map;     private List<HttpSession> sessions;      @Override     public void sessionDestroyed(HttpSessionEvent se) {         sc = se.getSession().getServletContext();          currentSession = se.getSession();         clientIp = (String) currentSession.getAttribute("clientIp");         map = (Map<String, List<HttpSession>>) sc.getAttribute("map");         //从Map中获取List         sessions = map.get(clientIp);         //从List中删除当前Session对象         sessions.remove(currentSession);         //如果List中没有该元素,则说明当前IP所发出的会话全部关闭,就可以从map中         //将当前IP对应的Entry对象删除         //若List中仍有元素,当前IP所发出的会话任存在,那么将变化过的List写回到map          if (sessions.size() == 0){              map.remove(clientIp);          }else {              map.put(clientIp,sessions);          }          sc.setAttribute("map",map);     } }
  因为处理的退出的页面 /logoutServlet 不需要做任何不同的处理,所以这里将不再重复。
  因为在jsp用到了JSP标准库,所以到导两个包。 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html>   <head>     <title>$Titlelt;/title>   </head>   <body>   <center><h1>You are the ${applicationScope.map.size()} customer to visit. </h1>
  <h3>       安全退出
  </h3>     <h2>       <c:forEach items="${map}" var="entry">         ${entry.key }=${entry.value.size()}
  </c:forEach>     </h2>   </center>   </body> </html>
  最后 测试成功,这就是一个完美的统计当前用户的在线人数。
  来源:https://mp.weixin.qq.com/s/gM-lyh_9FeFKRRAJlPY83g</pre><hr>
<div class="middle_list"><a href="at_75305.html">山河月明李善长用生命告诉你怼老板的打工人下场有多惨</a>追剧追了快三十集,老成持重深谋远虑的老相国终于发飙了!昨天的剧集中,我们终于看到了敢于跟明朝大老板朱元璋撕破脸皮对质甚至对骂的大臣了!朱元璋对于一干淮西勋贵在老家凤阳府大肆兼并田产<a href="at_75306.html">同样留龙须刘海,把肖战王一博和古天乐放一起对比,差距就出来了</a>同样是古装龙须刘海造型,但是在不同的脸上体现的效果有很大的差异呢。现在的鲜肉小生对比老牌古装男神差距更是明显。在近期热播剧且试天下中,杨洋的刘海造型就掀起了很高的讨论度。下面我们就<a href="at_75307.html">离婚还不到3个月,再看吴倩与张雨剑的境遇,夫妻差距一目了然</a>2022年2月14日情人节当天,吴倩突然在社交平台上发文,暗示自己已经与张雨剑离婚。正当人们疑惑已经与张雨剑官宣结婚的吴倩,为何情人节发文暗指单身时,吴倩工作室很快发文声明,宣布吴<a href="at_75308.html">10年婚姻如陌路,潘粤明和董洁的婚姻,早就该结束了</a>2005年,董洁和潘粤明因戏生情。恋爱三年后,两人低调完婚。婚后他们爱情的结晶儿子顶顶来到了这个世界。这时的两个人事业都处于上升期,婚姻看起来很是幸福。一时间,董洁和潘粤明成为了人<a href="at_75309.html">何炅谢娜突然登上热搜,快本节目要回来了?</a>何炅谢娜突然登上热搜,快本节目要回来了?其实并没有!!!说起来,何炅谢娜这个合体热搜来得挺突然的,还带着快本的标签,一度让不少快本的老粉热血沸腾,还以为快本是在预热回归了。热搜中的<a href="at_75310.html">新手妈妈注意!给婴儿洗澡牢记2要8不要</a>婴儿在洗澡时,新手爸爸妈妈稍微不注意可能会引发生命危险!不要绝对我危言耸听!为了避免这样的悲剧发生,新手爸妈们需要注意2个要8不要!一2要1由于婴儿太小,自我保护意识不强,所以娃在<a href="at_75311.html">王思聪被禁言,这次是否会被父亲教育?王健林曾头疼儿子爱得罪人</a>4月19日,王思聪的微博账号被禁言了,理由是违反相关法律法规。而此事的起因,就是王思聪转发了质疑连花清瘟,以及以岭药业有操控股价嫌疑的微博,他呼吁严查以岭药业。之后连花清瘟就处在风<a href="at_75312.html">归化球员李可更新社媒明天将回到中国</a>直播吧4月21日讯今日,归化球员李可更新了个人社交媒体,表示自己将在明天回到中国。上赛季,李可受到伤病影响,只代表国安出战了3场比赛,贡献了1次助攻,随后便前往英国接受治疗。目前来<a href="at_75313.html">跨界成功!孙杨正式卸任中国游泳队队长,如今带货比游泳收入高</a>最近,一些新闻媒体注意到了游泳运动员孙杨。经过禁赛事件之后,孙杨慢慢成功转型。现在他不会再专注于游泳,而是开始了自己的直播。孙杨非常喜欢游泳。大家都知道,他在游泳领域也取得了许多优<a href="at_75314.html">日本邮政明起暂停发往中国的EMS及包裹邮寄服务</a>据央视财经报道,当地时间4月21日下午,日本邮政公司在官网发布消息称,受新冠疫情影响,决定从4月22日起,暂停发往中国(港澳台地区除外)的EMS服务航空及海运包裹服务。寄往中国的书<a href="at_75315.html">中国你最美</a>春曰生活打卡季在家云旅游继续总结我的西北之旅中国最美66号公路。青海省有一条u型公路被称为中国版66号公路。其实就是一条国道,风景凹凸有致,路边两侧风景也十分漂亮,既有西北的野性,</div>
<div class="middle_page"><a href="/udt/ls_7758.html"><<<</a><a href="/udt/ls_7757.html"><<</a><a href="/udt/ls_7756.html"><</a><span>-</span><a href="/udt/ls_7754.html">></a><a href="/udt/ls_7753.html">>></a><a href="/udt/ls_7752.html">>>></a></div></div>
<div class="middle_right"><a href="https://www.vkhz.com/think.html"><img src="/static/vkhz.png" width="100%"></a><a href="at_1056483.html">绝美!无锡鼋头渚夜樱游园开启</a>现代快报讯(记者陈敏)近日,2023中国无锡太湖鼋头渚国际樱花节开启,整个樱花节从3月1日持续至5月3日。其中,夜赏樱花游园会于18日正式开启,持续至3月28日,持续11天,夜间华<a href="at_1056484.html">个人旅行社注册需要什么条件及办理流程</a>个人旅行社注册需要什么条件及办理流程春暖花开的季节,外出旅游蠢蠢欲动,从而旅行社的需求量增加。目前旅行社的需求供不应求,个人注册一家旅行社需要什么条件和流程呢?接下来我们来学习一下<a href="at_1056485.html">纳乌鲁斯节来临,哈萨克斯坦人小长假可以去哪里玩?</a>哈萨克斯坦人在纳乌鲁斯节可以休息3天,3月21日至23日。学生的春假是3月18日26日。如果父母可以调休或请假,那么在三月的小长假里,他们可以就有5到7天的时间和家人们一起度过愉快<a href="at_1056486.html">西湖,不止在杭州,大成都也有了</a>西湖,最出名的莫过于浙江杭州了,人们一般说的西湖也多是说的杭州西湖。断桥残雪,雷锋夕照,多是美不胜收的仙景。可是你知道吗,中国还有很多个西湖,福州西湖海口西湖兰州西湖青岛小西湖沈阳<a href="at_1056487.html">即将加盟国安?恩加德久财务状况很重要,不能保证还留在根特</a>直播吧3月21日讯据比利时媒体voetbalnieuws报道,国安正在推进喀麦隆中后卫恩加德久的转会,后者也承认很可能离开根特。当前在转会市场上,北京国安正在加速恩加德久的引进工作<a href="at_1056488.html">NBA明日战况分析及比分预测</a>特别专栏今日精彩比赛回顾(今天精彩赛事5场,小编通过自己犀利幽默的文采再次带领各位粉丝一起来回顾一下比赛精彩瞬间)布克空砍46分难救主,亚力山大40分主场力克太阳升至西部第八北京时<a href="at_1056489.html">德尚迈尼昂会是一号门将格列兹曼可能成为常规性组织核心</a>直播吧3月21日讯法国国家队主帅德尚日前在出席球队新闻发布会时表示,迈尼昂会是球队的一号门将,格列兹曼会成为常规性的组织核心。记者您在门将位置上已经有出场先后顺序安排了吗?德尚这个<a href="at_1056490.html">纳达尔跌出ATP世界前十!17年惊人纪录宣告终结!</a>北京时间3月20日消息。ATP公布了本周世界排名,男单方面,刚刚在印第安维尔斯大师赛夺冠的阿尔卡拉斯携冠重返世界第一,卫冕失败的弗里茨损失积分下滑到第十位勉强保住Top10的排名。<a href="at_1056491.html">安丘农商银行服务送上门实事办到家</a>客户服务无小事。近年来,安丘农商银行始终坚持以客户为中心的服务理念,扎实推进我为群众办实事实践活动,以贴心服务满足老年客户特殊群体金融需求,用实际行动提升客户金融服务获得感。3月1<a href="at_1056492.html">乌鲁木齐出台第二批就业创业政策涉及创业社区等21个方面</a>21日,乌鲁木齐市稳就业促创业新闻发布会现场。喇小飞摄中新网乌鲁木齐3月21日电(喇小飞)记者从21日举行的乌鲁木齐稳就业促创业新闻发布会上获悉,乌鲁木齐出台第二批稳就业促创业政策<a href="at_1056493.html">童心飞翔,点亮梦想!辉南县泰安社区小候鸟图书角故事分享会开始啦</a>3月19日上午,辉南县泰安社区新时代文明实践站联合辖区课后班开展以童心飞翔点亮梦想为主题的小候鸟图书角故事分享活动。泰安社区新时代文明实践站温馨多元有趣的活动空间,让孩子们很快融入<div class="middle_right_youlian"></div></div></div>
</body></html>