各位大虾!
    我在做一个投票网页的时候遇到了这样的问题,用户投票都不需要注册的!本来想限制IP来着,但是这样以来同一个局域网的用户就没办法投了!索性想降低一下标准,就是只限制给一个人只能投一次,例如给A投票后就不能再投了,但是还可以继续给B投票,以此类推。但是我现在做的头都大了也没有实现,不知道大家有什么好的方法吗??
    能用Session的方法实现吗?应该怎么去做呢??现在头都转了!!!!!

解决方案 »

  1.   

    好像有网站是用写Cookie的办法实现的。
    同时还配合IP投票记数
      

  2.   

    用request.gethost方法,判断IP吧.IP重复就禁止投
      

  3.   

    还是根据网卡MAC地址来做吧
    import java.io.*;public class Test1 {
    public static void main(String[] args) {
    try {
    Process process = Runtime.getRuntime().exec("ipconfig /all");
    InputStreamReader ir = new InputStreamReader(process.getInputStream());
    LineNumberReader input = new LineNumberReader(ir);
    String line;
    while ((line = input.readLine()) != null)
    if (line.indexOf("Physical Address") > 0) {
    String MACAddr = line.substring(line.indexOf("-") - 2);
    System.out.println("MAC address = [" + MACAddr + "]");
    }
    } catch (java.io.IOException e) {
    System.err.println("IOException " + e.getMessage());
    }
    }
    }
    这个MACAddr就是本机的MAC地址
      

  4.   

    取得mac地址不难,就是如何去对比呢??又不写入数据库.
      

  5.   

    恩,我试验过了,是本机的mac阿!不是客户的MAC
      

  6.   

    取得mac地址不难,就是如何去对比呢??又不写入数据库.
    ----------
    我找了一下,用js实现的,不过不对,还有楼上用java代码实现的,在客户端是不可能运行的
      

  7.   

    <HTML><HEAD><TITLE>WMI   Scripting   HTML</TITLE>   
      <META   http-equiv=Content-Type   content="text/html;   charset=gb2312">   
      <SCRIPT   language=JScript   event="OnCompleted(hResult,pErrorObject,   pAsyncContext)"   for=foo>   
      document.forms[0].txtMACAddr.value=unescape(MACAddr);   
      document.forms[0].txtIPAddr.value=unescape(IPAddr);   
      document.forms[0].txtDNSName.value=unescape(sDNSName);   
      //document.formbar.submit();   
          </SCRIPT>   
        
      <SCRIPT   language=JScript   event=OnObjectReady(objObject,objAsyncContext)   for=foo>   
            if(objObject.IPEnabled   !=   null   &&   objObject.IPEnabled   !=   "undefined"   &&   objObject.IPEnabled   ==   true)   
            {   
              if(objObject.MACAddress   !=   null   &&   objObject.MACAddress   !=   "undefined")   
              MACAddr   =   objObject.MACAddress;   
              if(objObject.IPEnabled   &&   objObject.IPAddress(0)   !=   null   &&   objObject.IPAddress(0)   !=   "undefined")   
              IPAddr   =   objObject.IPAddress(0);   
              if(objObject.DNSHostName   !=   null   &&   objObject.DNSHostName   !=   "undefined")   
              sDNSName   =   objObject.DNSHostName;   
              }   
          </SCRIPT>   
        
      <META   content="MSHTML   6.00.2800.1106"   name=GENERATOR></HEAD>   
      <BODY>   
      <OBJECT   id=locator   classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6   VIEWASTEXT></OBJECT>   
      <OBJECT   id=foo   classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>   
      <SCRIPT   language=JScript>   
            var   service   =   locator.ConnectServer();   
            var   MACAddr   ;   
            var   IPAddr   ;   
            var   DomainAddr;   
            var   sDNSName;   
            service.Security_.ImpersonationLevel=3;   
            service.InstancesOfAsync(foo,   'Win32_NetworkAdapterConfiguration');   
            </SCRIPT>   
        
      <FORM   id=formfoo   name=formbar   action=NICPost.asp   method=post><INPUT   value=00:05:5D:0E:C7:FA   name=txtMACAddr>   <INPUT   value=192.168.0.2   name=txtIPAddr>   <INPUT   value=typ   name=txtDNSName>   </FORM></BODY></HTML>
    这是取客户端的MAC,你说不存入数据库,那你的投票结果也不要存入数据库吗,如果存入数据库的话,就把投票人的MAC也存入投票结果的这个记录中,那么当用户再投票时就把他的MAC和数据库中前10分钟投票的MAC进行比较(假定10分钟之内不能重投),有相同的就不能投,没有相同就投票成功
      

  8.   

    我能想到session的方法
    在表单提交的时候加上一个写一个session并设置标记为false
    提交之后检测标记如果是false则同意提交并设为true。
    不过防止投票作弊几乎是不可能的
      

  9.   

    to liaohaiying(小菜)
    假如用户是firefox,就不能正常取到值
      

  10.   

    这种方式是没办法绝对禁止
    1。ip
       如果是共享ip,容易禁错人
    2。cookie
       如果用户禁用了,或删除本地文件也就失效了3.mac
     没用过,好像要取到也比较麻烦
      

  11.   

    yifanwu(逸凡)
    ====================
    要钱的别来这里起哄,真他妈财迷
      

  12.   

    呵呵,跨浏览器本来就是一个严重的问题,不过在firefox中肯定也有值MAC的方法,大不了先判断一下是什么浏览器再运行哪段代码就行了
      

  13.   

    IP & Cookie
    如果服务器和客户端都在局域网里,才可以用MAC,否则不可能
      

  14.   

    liaohaiying(小菜) 
    可否把你的回帖转载到www.88doc.com上呢?
    谢谢
    用js记录客户端的MAC 是个非常不错主意
      

  15.   

    不要想在网页上用代码获取客户端的MAC地址了,浏览器安全限制不允许你这么做!
    除非你自己些个ACTIVEX控件!没办法做到真正的防作弊,只有尽可能加大作弊的难度。设置为注册用户才可以投票;
    增加IP限制;
    增加验证码机制;
    增加当天投票对比;好运!
      

  16.   

    多谢大家帮助,问题已经基本上解决了!
    我采用的上大家上述的方法,我建立了一个临时表temp,这张表记录ip地址,你要投票的人的id和你的上次投票时间.
    每次取得客户ip,id,取查询表中有没有上次投票的时间,没有就投,若有则与当前时间比较大于30分钟则可以投,否则不容许.
    而且为了防止这张表的数据条数不断的增加,就限定数据条数,大于一个值就将最早的一部分数据删除.呵呵.是不是很麻烦阿!本来想取mac来着,用java好像很困难,取的都是服务器的mac.用js时网页老提示要不要执行activeX,如果不执行也取不到,所以就降低标准了.再次谢谢大家阿!散分先!!!
      

  17.   

    下面是Servlet的代码,贴出来大家共享
    String pip = request.getParameter("pip");//取客户ip
    String tt = request.getParameter("dd");
    int dd = new Integer(tt).intValue();//取客户当前时间
    String id = request.getParameter("userid");//取人物idboolean commitflg = false;
    try
       {
    this.conn = DBConnectionDAO.getConnection();
    conn.setAutoCommit(false);
    VoteSQL check = new VoteSQL(conn);
    //查询上次投票时间
    int mnt = new Integer(check.FindMac(id,pip)).intValue();
    if(mnt!=0)
    {
    //有记录
    session.setAttribute("ERRORMSG", "请您不要重复投票,谢谢!!");
    response.sendRedirect("site/voteerr.jsp");
    }
    else
    {
    //没有记录,添加记录
    check.AddVote(id);
    int count = 0;
    //查询数据条数
    count = check.AddMac(id, pip, tt);
    //System.out.println("The syscount is "+count);
    if (count>200)
    {
       //删除数据库一部分记录
       check.DelTemp(count);
     }
     //System.out.println("SSSSSSSSSSSSSSSSSSSSS");
      conn.commit();    
      session.setAttribute("userid", id);   
      session.setAttribute("allvote",check.FindAllVote());
      response.sendRedirect("site/allvote.jsp");
    }
    }
    页面代码:
    <%@ page import="java.io.*" %>
    <%@ page import="java.util.*" %><%
    PageBean pageusers = (PageBean) session.getAttribute("pageusers");
    //System.out.println("list is "+pageusers.getUserList());
    String pip = request.getRemoteAddr();
    Date dt = new Date();
    int dd = dt.getMinutes();
    //System.out.println("The page time is "+dd);
    %>多谢大家支持帮助!
      

  18.   

    我的做法是用“客户端IP+cookie+时间差”三者结合判断,用户IP+COOKIE 合在一起作为用户唯一身份的判断,投票的时候记录时间,然后限制一个小时内不允许重复投票,这样可以准确判断每一台电脑,无论是局域网的,用代理的,还是直接联的,也兼顾几个方面,可以防止频繁投票作弊,又让公用电脑不同用户可以投票。
        参考例子:http://60.191.62.5:86/MagicYellow.html
      

  19.   

    ..Lvyou1980(Lvyou)的方法我也曾想过,但是如果客户端删除了刚才投票时产生的cookies,这样第二次投票时与你在服务器端保存的“用户唯一身份”就不同了,也很容易实现作弊。除非你有办法每次给这个用户都产生同样的cookies。(但其他人却是不同的cookies)
    而如果每次每个人都是同样的cookies,那就等于是只用ip判断了。
    其实防止重复投票的方法就是要找出一个“唯一识别证”,在服务器端获得这个“唯一识别证”,类似于你一登录网站就注册了,下次登录还是这个用户名。
      

  20.   

    哎, 怎么这么多人连基本的网络知识都没有...   想获得MAC地址根本就不可能..。 .   先去看看ISO的7层网络体系结构的定义吧...