JavaWeb-网站在线用户信息、网站访问量以及管理踢出用户实例

转载请注明出处: http://blog.csdn.net/qq_26525215
本文源自大学之旅_谙忆的博客

这个稍微比上个版本做得完善了一点,用了JavaBean来封装用户信息,添加了一个管理踢用户的功能。
上一个的用户访问量是通过监听request来统计的,在这个实例中,我们也可以通过过滤器来实现统计网站访问量。

直接看源码吧,感觉没多少要讲的,我习惯把解释写在代码中。

部分源码

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>在线人信息管理与统计</title>
</head>

<body>
    <h2>在线人信息管理与统计</h2>

    <c:if test="${empty sessionScope.user}" var="boo">
        <h3>会员登录:</h3>
        <form action='<c:url value='/LoginServlet'></c:url>' method="post">
            姓名:<input type='text' name="name"><br /> <input type="submit"
                value="注册">
        </form>
    </c:if>

    <c:if test="${!boo}">
        亲爱的${user.name}
        <c:if test="${user.admin}" var="bo">
            -管理员
        </c:if>
        <c:if test="${!bo}">
            -会员
        </c:if>
        ,欢迎来到...<br />
    </c:if>

    <br />
    <a href="<c:url value='/servlet/ShowServlet'/>">显示所有在线用户</a>
    <br />
    <a href="<c:url value='/servlet/LogOutServlet'/>">安全退出</a>

    <br/>网站访问量:${count}

</body>
</html>

MyServletContextListener

这个就是实现把访问量持久化的监听器实现类:

package cn.hncu.listeners;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListener implements ServletContextListener{

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //从服务器硬盘把之前存储的点击量数据读取出来
        ServletContext sct = sce.getServletContext();
        String path = sct.getRealPath("/count.txt");
        try {
            BufferedReader br = new BufferedReader(new FileReader(path));
            String line = br.readLine();
            Integer count = Integer.valueOf(line);
            sct.setAttribute("count", count);
        } catch (Exception e) {
            //如果出异常了,我们认为文件还不存在,服务器第一次启动
            e.printStackTrace();
            sct.setAttribute("count",new Integer(0));
        }

    }

    //关闭服务器时
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //把当前servletContext容器中存储的点击量数据 永久化到  服务器硬盘
        ServletContext sct = sce.getServletContext();
        String path = sct.getRealPath("/count.txt");

        try {
            PrintWriter pw = new PrintWriter(path);
            pw.write(""+sct.getAttribute("count"));
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

}

CharsetFilter

实现统计访问量和全站编码的过滤器

package cn.hncu.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class CharsetFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");

        //获取该用户的ip,存储到它的session对象中
        HttpServletRequest req = (HttpServletRequest) request;
        if(req.getSession().getAttribute("ip")==null){
            req.getSession().setAttribute("ip", req.getRemoteAddr());
            //这里的req和request是同一个对象!!!
            //所以传过去的参数还可以是request
        }

        //new一个线程统计访问量
        new MyThread(request.getServletContext()).start();

        //放行
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
}

class MyThread extends Thread{
    private ServletContext servletContext =null;
    private static Object boj = new Object();

    public MyThread(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    @Override
    public void run() {
        synchronized (boj) {
            servletContext.setAttribute("count",(Integer)servletContext.getAttribute("count")+1);
        }
    }

}

LoginFilter

用户访问其他页面时进行的权限过滤:

如果你没有登陆,就不给你权限去访问除主页外的其他页面。

package cn.hncu.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if(req.getSession().getAttribute("user")==null){
            HttpServletResponse resp = (HttpServletResponse) response;
            resp.sendRedirect(req.getContextPath()+"/index.jsp");
        }else{//放行
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }

}

MySessionListener

有用户来访问时,我们就通过监听器去监听session的创建与销毁,在这里,我们认为一个session就是一个用户!

package cn.hncu.listeners;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener{

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        Map<String, HttpSession> onLines = (Map<String, HttpSession>) se.getSession().getServletContext().getAttribute("onLines");
        if(onLines==null){//第一个来访问的
            onLines = Collections.synchronizedMap(new HashMap<String, HttpSession>() );//使用同步技术的Map
            se.getSession().getServletContext().setAttribute("onLines", onLines);
        }
        onLines.put(se.getSession().getId(), se.getSession());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        Map<String, HttpSession> onLines = (Map<String, HttpSession>) se.getSession().getServletContext().getAttribute("onLines");
        //这里也要防范好!多线程,多个管理同时踢一个人的时候,如果不防范就会出问题
        if(onLines.containsKey( se.getSession().getId() )){
            onLines.remove( se.getSession().getId() );
        }

    }

}

LoginServlet

用于判断用户登录与设置管理员的servlet。

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hncu.domain.User;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String name = request.getParameter("name");
        if(name!=null && name.trim().length()>0){
            User user = new User();
            user.setName(name);
            //用user作为参数到后台登录,这里我们简化了,直接假设登录成功
            if(true){
                Random r = new Random();
                int a = r.nextInt(2);
                if(a%2==0){
                    user.setAdmin(true);
                }else{
                    user.setAdmin(false);
                }
            }
            request.getSession().setAttribute("user", user);
        }

        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

}

LogOutServlet

用于用户的安全退出!

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogOutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //用户安全退出很简单,我们在服务器端移除用户的session就可以了
        request.getSession().invalidate();

        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }
}

ShowServlet

显示所有用户信息时的servlet,需要把信息全部封装到request这个容器中,再转发到前台jsp显示的页面。

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ShowServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Map<String, HttpSession> onLines = (Map<String, HttpSession>) getServletContext().getAttribute("onLines"); 

        List<Map<String, Object>> lists = new ArrayList<Map<String,Object>>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //遍历onlines,针对每个session对象封装一个map(信息包含:name,createTime,lastAccessTime,ip),把该map添加到list当中
        Iterator<Entry<String, HttpSession>> it = onLines.entrySet().iterator();
        while(it.hasNext()){
            Entry<String, HttpSession> en = it.next();

            Map<String, Object> m = new HashMap<String, Object>();

            m.put("id", en.getValue().getId() );
            m.put("user", en.getValue().getAttribute("user"));

            String creationTime = sdf.format(new Date(en.getValue().getCreationTime()));
            m.put("creationTime", creationTime);
            String lastAccessTime = sdf.format( new Date(en.getValue().getLastAccessedTime()) );
            m.put("lastAccessTime", lastAccessTime);

             //注意,该ip数据是在CharsetFilter中封装的
            m.put("ip", en.getValue().getAttribute("ip"));

            lists.add(m);
        }

        request.setAttribute("onLines", lists);
        request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);
    }
}

show.jsp

前台在线用户的显示页面,会员和管理员看到的页面是不同的,管理员可以踢人。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>在线人信息管理</title>
    <style type="text/css">
       table{
          border: 1px solid red;
          border-collapse: collapse;/*设置单线-线合并*/
          width: 80%;
       }
       td{
          border: 1px solid red;
          padding:3px;
       }
       .header{
         background: gray;
       }
    </style>
  </head>

  <body>
    <h2>以下是所有在线用户信息</h2>
    <table>
       <tr class="header" >
          <td>姓名</td>  <td>上线时间</td>  <td>最后访问时间</td> <td>IP</td> <td>操作</td>
       </tr>

       <c:forEach items="${requestScope.onLines}" var="map">
        <tr>
            <td>
                <c:if test="${empty map.user}" var="boo">
                    游客
                </c:if>
                <c:if test="${!boo}">
                    ${map.user.name}
                </c:if>
            </td>
            <td>${map.creationTime}  </td>
            <td>${map.lastAccessTime}</td>
            <td>${map.ip }           </td>

            <td>
                <c:if test="${!boo&&user.admin}">
                     <a href="<c:url value='/servlet/KickOutServlet?id=${map.id}'/> " >踢出${map.user.name}</a>
                </c:if>
            </td>
        </tr>
       </c:forEach>
    </table>
       <br/>网站访问量:${count}
  </body>
</html>

KickOutServlet

管理踢人时请求的servlet,在这里我们把被踢的人的session从服务器端移除就可以了。但是注意防范一下,那个被踢者是否已经被踢走了、

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class KickOutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();
        String id = request.getParameter("id");
        Map<String, HttpSession> onLines = (Map<String, HttpSession>) getServletContext().getAttribute("onLines");

        if(onLines.containsKey(id)){
            HttpSession session = onLines.get(id);//得到该session
            session.invalidate();//移除该session
            out.println("该用户已被踢出!");
        }else{
            out.println("该用户已经不存在!");
        }
    }
}

user

JavaBean,在这里,我就是简单的封装了一个JavaBean使用了。我们的知识点并不是这里。

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class KickOutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();
        String id = request.getParameter("id");
        Map<String, HttpSession> onLines = (Map<String, HttpSession>) getServletContext().getAttribute("onLines");

        if(onLines.containsKey(id)){
            HttpSession session = onLines.get(id);//得到该session
            session.invalidate();//移除该session
            out.println("该用户已被踢出!");
        }else{
            out.println("该用户已经不存在!");
        }
    }
}

web.xml

注意啊!无论是servlet还是监听器,过滤器!一定要记得配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name> 

  <listener>
    <listener-class>cn.hncu.listeners.MyServletContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>cn.hncu.listeners.MySessionListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>LogOutServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.LogOutServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.ShowServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>KickOutServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.KickOutServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LogOutServlet</servlet-name>
    <url-pattern>/servlet/LogOutServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowServlet</servlet-name>
    <url-pattern>/servlet/ShowServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>KickOutServlet</servlet-name>
    <url-pattern>/servlet/KickOutServlet</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>charset</filter-name>
    <filter-class>cn.hncu.filter.CharsetFilter</filter-class>
  </filter>
  <filter>
    <filter-name>login</filter-name>
    <filter-class>cn.hncu.filter.LoginFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>login</filter-name>
    <url-pattern>/servlet/*</url-pattern>
    <url-pattern>/jsps/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>charset</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

演示结果:

登录之前显示的主页:

未登录的时候,是无法进入显示所有在线用户的,用过滤器拦截了。

登录之后显示的主页:

管理员登录后显示的在线人信息

如果不是管理员登录后,最后的操作时不会显示的。

完整的项目链接:

https://github.com/chenhaoxiang/Java/tree/master/myOnlinesWeb2

myOnlinesWeb2.zip压缩文件

希望本篇博客对大家有一点用(^-^)

转载请注明出处: http://blog.csdn.net/qq_26525215
本文源自大学之旅_谙忆的博客

时间: 2024-10-22 17:23:51

JavaWeb-网站在线用户信息、网站访问量以及管理踢出用户实例的相关文章

linux下管理员强行踢出用户的命令使用方法

  linux强制踢出用户命令: 一.输入w命令查看已登录用户信息 [root@KW_S01_192.168.1.106_A ~]# w 19:22:31 up 2:11, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.178 18:41 0.00s 0.16s 0.01s w root pts/1 192.168.1.178 19:22

JavaWeb-Servlet技术的监听器-解析与实例-网站在线用户信息与网页点击量

转载请注明出处: http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 在Web项目中,我们对下面这几个监听器必须熟练的使用,它们的作用真的很大.熟练的使用后,可以使我们少绕弯路,少写很多代码. 事件源 监听对像的创建和销毁 监听对像上属性的添加和删除 HttpSession HttpSessionListener HttpSessionAttributeListener - HttpSessionEvent ServletRequest Servl

eBay收购比利时两大分类信息网站

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 新浪科技讯 北京时间7月4日晚间消息,eBay周四宣布, 已收购比利时在线分类信息网站2dehands.be和2ememain.be. 2dehands.be和2ememain.be在比利时较受欢迎,两家网站的月独立用户访问量总计为550万.比利时的人口总量约为1100万. 交易完成后,这两家网站将被整合到eBay的分类网站业务部门.该业务部

通过数字中国智能产品网来看行业信息网站推广

中介交易 SEO诊断 淘宝客 云主机 技术大厅 数字中国智能产品网(www.dichn.com)这几天上线了我昨天详细了看了下,现在来看感觉和当初我们想的差不多,版面设计和网站的外观看起来精致,第一印象的目的达到了,自身的内容也不差.起初我们考虑网站的时候 我觉得这网站上线后应该有三个点值得看的:首先个性化的推广方式,其次广告的,最后是企业的互动性,虽然现在还有一些系统没有做完.但是现在整体的架构已经在完善了.我预感在推广及企业互动方面应该是将来最能让智能卡产品网站能发亮的地方了.所以行业分类网

分类信息网站逐渐走入人们的的生活

随着口碑网.58.客齐集.易登网等网站的逐渐壮大,分类信息网站逐渐走入人们的的生活.在纷繁的生活信息下,分类信息网站细分化.低端化,给网民提供一个便利的信息平台,可以以最快知道生活信息.比起论坛和行业门户网站,分类信息网站更具有平民化的魅力. 电子商务是提供一个便利的商务平台,但是分类信息提供的是信息平台,上边大部分信息不是为了商务,而是一种简单的生活举动.甚至低门槛是很多没有价值的信息传播和扩展,有时影响到社会和文化的建设.反过来说,分类信息网站上有很多线上提供信息,线下交易,就造成了商务活动

网站优化如何为网站带来实际的成交量

为什么我们要做网站优化,做了网站优化有什么好处?这种疑问对于企业管理者是普片存在的.然而我们说网站优化是网站生存必须操作的,网站发展的根本.网站作为互联网上搜索者了解自身企业或者产品的指标门户,要被搜索者发现距需要被搜索引擎记录,要被搜索引擎记录收藏,就要网站整体结构便于搜索引擎爬行,文章内容,具有权威性值得搜索引擎记录.网站优化就是基于搜索引擎优化的学术技巧.企业做网站的目的是什么?为了从网络资源上得成交客户得到最终的盈利目的.做了网站优化有什么理由成交客户?这是今天我们所要谈论的话题: 关键

315晚会曝光网易通过邮箱收集用户信息进行精准的广告投放

和讯科技消息 3月15日,http://www.aliyun.com/zixun/aggregation/10556.html">央视315晚会曝光一些广告公司通过收集cookies掌握大量用户信息,网易公司则通过分析用户的邮箱内容收集用户信息,以进行精准的广告投放. 据315晚会报道,品友互动.易传媒.传漾科技.亿玛在线.精硕世纪科技等公司,通过在网页中加入代码,掌握几亿用户的cookies,在用户完全不知情的情况下,从用户的上网习惯到IP地址. 账号密码.几点几分几秒访问了什么网站等都

QQ泄露12亿用户信息 网友呼吁让腾讯上315

据新华社报道,腾讯QQ群数据遭泄露,用户姓名年龄等信息均可"秒查"?据悉,此次数据泄露涉及7000多万个QQ群.12亿个部分重复的QQ号. 已涉及12亿个QQ号 国内知名安全漏洞监测平台乌云20日公布报告称,腾讯QQ群关系数据被泄露,数据下载链接很轻易在迅雷快传找到.根据QQ号,可以查询到备注姓名.年龄.社交关系网甚至从业经历等 大量个人隐私. 有用户透露,通过迅雷下载到了此次被 曝光的"QQ群数据库",并通过简单测试验证了数据的真实性."解压后达90多G

js获取浏览器用户信息再创建不同版本的flash组件

这是一款利用了在flash网站的代码,他是利用js获取浏览器用户信息再创建不同版本的flash组件实例,这样很好的兼容大部份主流浏览器就ok了. */ var isie  = (navigator.appversion.indexof("msie") != -1) ? true : false; var iswin = (navigator.appversion.tolowercase().indexof("win") != -1) ? true : false;