java做投票系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java做投票系统相关的知识,希望对你有一定的参考价值。

用java做投票系统,如何设计,如何实现,希望有大神帮忙。。。。高分
我用的是SQLserver2008,有代码的麻烦发给我一下。限java的,300分。

java做投票系统,设计程序如下:

import java.util.Set; //调用java.util.Set
import java.util.HashSet;//调用java.util.HashSet
import java.util.Iterator;//调用java.util.Iterator

public class Voter //定义类
private static final int MAX_COUNT=100; //静态变量,最大投票数,到达此数就停止投票
private static int count; //静态变量,投票数
private static Set<Voter>voters=new HashSet<Voter>(); //静态变量,存放所有已经投票的选民
private String name; //实例变量,投票人姓名

public Voter(String name)this.name=name; //定义名字字符串函数

/**投票*/
public void voteFor() //投票函数
if(count==MAX_COUNT) //如果计数结果等于投票人数最大值
System.out.println("投票活动已经结束"); //打印投票活动已经结束
return; //返回主函数

if(voters.contains(this)) //如果已包含投票人姓名
System.out.println(name+":你不允许重复投票!"); //打印投票人姓名和你不允许重复投票!
else //否则
count++; //计数加一
voters.add(this); //调用字符串函数添加投票人姓名
System.out.println(name+":感谢你投票!"); //打印投票人姓名和感谢你投票!



/**打印投票结果*/
public static void printVoteResult() //投票结果函数
System.out.println("当前投票数为:"+count); //打印当前投票数为,并且统计人数
System.out.println("参与投票的选民名单如下"); //打印参与投票的选民名单如下
for(Voter voter:voters) //遍历voters集合
System.out.println(voter.name); //打印输出投票名称



public static void main(String args[]) //主函数
Voter tom=new Voter("Tom"); //开辟空间定义元素tom
Voter mike=new Voter("Mike"); //开辟空间定义元素mike
Voter jack=new Voter("Jack"); //开辟空间定义元素jack

tom.voteFor(); //进入tom的投票函数
tom.voteFor(); //进入tom的投票函数
mike.voteFor(); //进入mike的投票函数
jack.voteFor(); //进入jack的投票函数

Voter.printVoteResult(); //投票结果打印函数



参考技术A 获取客户端ip存进数据库中,只能进行投票一次,之后投票无效
表:
1.存客户端ip 外联主表
2.主表投票动作,标题,内容,时间,时长等等
3.投票状态次数追问

这些基本逻辑都知道,从页面到数据库设计,代码设计,怎么实现啊

追答

页面弄一个静态页,动态查处你的投票内荣,然后点击投票出发事件,把投票对应内容id和状态传到后台,然后就是你的后台数据操作了呗

追问

投票内容如何生成?这个也是个问题。

追答

-_- 在主表里面查出来啊,然后在jsp里显示不就完了么

追问

投票内容是动态生成的

追答

你会java?做多久了

追问

略懂而已,谢谢

追答

在数据库里查出你的投票内容,在jsp里面显示出来,就是这么个流程啊

追问

我们弄一个静态页当让是可以,但是别人不会弄的怎么办啊,所以弄静态页是不现实的。我是想问题内容是客户自己生成,我们就是记录问题,统计结果这样而已。

追答

你这叫用户反馈,不叫投票,直接一个输入框,然后提供几个选项分类,然后让用户自己输入就完事了

本回答被提问者采纳
参考技术B 昨天在一个网站看到一个投票系统源码,java的,你参考下http://www.java1234.com/a/kaiyuan/javaWeb/2013/0825/648.html追问

项目运行不了,红色叹号。

追答

哎呦,红色叹号应该是jar包没引对呗,tomcat什么的,求采纳,做任务啊

区块链投票系统概述

文章目录

前言

最近接到项目要做区块链投票系统,集中调研了下相关的知识,做这里做下简要的记录。区块链电子投票系统拆开看是两个问题:

  1. 什么是电子投票系统?
  2. 区块链能给电子投票系统带来什么?

什么是电子投票系统?

先来看第一个问题,什么是电子投票系统?根据维基百科-电子投票的定义:

电子投票,是一种投票设备,使用者直接按钮,就可以投票给自己所支持的候选人。
 
电子投票技术可以包括穿孔卡,光学扫描投票系统和专用投票亭(包括独立的直接记录电子投票系统或DRE)。它还可以涉及通过电话,私人计算机网络或互联网传送选票和投票。

以上可以看出,从投票地点的限制可以将电子投票分为两种:

  1. 在指定地点(比如投票站)通过指定设备进行投票
  2. 在任意地点通过互联网传送选票和投票

传统投票流程

可能有同学会问,为什么投票地点的限制要单独拿出来讲,这个很重要吗?先来看传统投票的过程。

传统投票都是在票站进行,主要分以下几个步骤

  1. 选民来到票站,首先进行身份验证并登记
  2. 领取选票,进入一个不受监控的隔间,打开信封,填写选票,并装回信封
  3. 将封好的选票投入一个透明的票箱
  4. 投票结束后,将票箱中选票进行充分混合,开始计票

传统投票的安全性

通常认为,投票过程有四个重要的安全要求,只有这些要求都被满足时,才能保证投票的安全:合法性、抗审查、秘密性、抗胁迫。可以总结为以下主要特征:

  • 秘密性(Confidentiality):除投票者自身外,其他人都不能知道他选票的内容。
  • 合法性(Eligibility):只有合法的投票者才能进行投票。
  • 唯一性(Uniqueness):每个合法的投票者只能投一票。
  • 公平性(Fairness):投票完成之前,任何人不能获知投票的结果,包括中间结果。
  • 无收据性(Receipt-Freeness):投票者不能向第三方证明自己选票的内容。
  • 匿名性(Anonymity):除投票者自身外,任何人都不能将某张选票与某个投票者
  • 可验证性(Verifiability):可以验证投票结果的正确性。
    联系起来。

对照上一节传统的投票流程:

  • 票站入口处的身份验证和验票时的有效性验证,保证了选票的合法性、唯一性
  • 选票的纸质存档保障了可验证性
  • 领取选票、填写、封口都在独立的、无监控不可拍照的隔间中进行,保障了匿名性
  • 开票前的票箱会被有意混淆,打乱其中选票顺序,保障了不能根据身份验证的顺序推导出投票的内容
  • 投票后无收据,无拍照,保障了抗胁迫性(无法向他人证明自己的投票内容)

电子投票的安全性

前面提到电子投票分两种,在指定地点(票站)投票和通过互联网投票。

  • 在指定地点投票与传统投票的区别只是取消了纸质投票,票站依然保留,选民只要在一个投票机上填写选票即可。但因为无纸质存档,安全性会变得更有挑战。美国和俄罗斯前几年都发生过大选投票系统被攻击的案例。同时如何向广大并无技术背景的选民证明系统的可靠性也是一大难题。
  • 互联网投票会让事情变得更加复杂。脱离了票站这个安全的物理环境,通过无收据性来保障无贿选和抗胁迫变得没有意义,选民可以通过设备录屏等方式变相取得投票的收据,胁迫投票也就变得可以实现。

所以为什么投票地点的限制要单独拿出来讲,因为这个真的有点无解。

电子投票做了些啥?

虽然有个目前无解的bug,但还是看下目前电子投票系统都做出来了些啥。需要了解以下知识:

  • 公钥密码
  • 同态加密(支持加法同态的 Paillier 算法)
  • 门限同态加密
  • 相同指数证明
  • 盲签名
  • 混合网络
  • 零知识证明
  • 单向散列函数
  • 数字证书

同时在传统投票系统的基础上,还对电子投票系统提出了新的要求:

  • 广义可验证性(Universal Verifiability):任何人都可以验证投票结果的正确性,
    包括非参与者。

概念不逐个展开写了,后面有空再补,大家感兴趣可以查一下。电子投票雏形源于Chaum于1981年提出的公钥密码体制,通过密码技术和计算机网络完成投票。1985年Cohen等提出了同态加密技术方案,构造电子投票,主要解决了匿名性和广义可验证性问题。同态加密技术成了构造电子投票的主要工具之一。Fujioka在1992年提出了著名的FOO92方案,引入了盲签名技术,解决电子投票的匿名性问题。无收据性概念是1995年Benaloh等人提出,用来解决买卖选票或者强迫投票等对投票活动有较大威胁的问题。Cramer使用门限同态加密、相同指数证明等技术试图构造一个同时满足广义可验证性和无收据性的方案,但是这个方案最终被证明并不满足无收据性。Lee在 Cramer 的方案基础上引入一个可信第三方作为验证者,使得改进后的方案满足无收据性,但是这个方案中的无收据性完全依赖于对可信第三方的高度信任。为了降低对可信第三方的信任依赖,研究者们设计了一些新的改进方案,利用多个实体共同参与相互监督的办法来分割权力。

总结一下就是大家想了许许多多密码学相关的算法来解决电子投票系统中需要的匿名性、广义可验证性、无收据性等问题。但是最终绕不过一个可信的第三方,为了解决这个问题,大家甚至想到了将第三方拆成了第三方们,提高了作弊的门槛。

区块链能给电子投票带来什么?

我理解区块链有三个主要技术:

  • p2p(peer to peer)
  • 链式结构
  • 共识算法

对应三个主要特点

  • 去中心化
  • 数据不可篡改
  • 数据公开可查

前面提到了电子投票系统的广义可验证性,可信的第三方,大家想到了啥?解决这个问题,妥妥的是区块链的强项呀!好,那接下来我们看区块链能给电子投票带来什么。

区块链天然适合用来做电子投票的公告板,所有数据上链为其带来广义可验证性以及不可篡改性。如果配合同态加密以及零知识证明算法等密码学技术,可以实现匿名的投票系统。下图展示了一种基于区块链匿名投票的详细流程,主要用到了RSA盲签名、Paillier算法,图中所有上传,指的是上传数据到区块链(摘自《基于区块链的匿名投票系统研究》,详细算法可参考原文3.3节,作者陈萍,2020)

我们的选择

看过以上的区块链投票方案后,结合国内的监管要求以及实际情况,我们决定不做完整意义上的区块链投票应用。从以下两个方面说明:

  • 强监管
    国家在大力发展区块链的同时,要求区块链应用可管可控(区块链技术可提高数据可信性和安全性),无论是腾讯的至信链,还是阿里的蚂蚁链,都不存在严格意义上的公链,都无法让用户通过个人钱包直接对链发起操作,都要通过企业或者开发者作为第三方中转进行上链操作,所以是伪去中心化,但是因为腾讯或阿里作为区块链技术提供方,分隔了第三方对链的直接操作,且用阿里或腾讯的信用作为背书,保障了可管可控模式下的不可篡改。

  • 无必要
    我们的投票应用主要用于小区业主进行表决,事项没必要做到无回执和完全匿名,可验证和可追溯是更重要的。无回执反而让用户觉得很奇怪,为什么我投了却看不到结果,教育成本会比较高。而且脱离了无保护的物理空间,无回执性变得没什么意义,录屏投票就可以变成新的取得回执手段。

  • 追溯门槛高
    向一个完全没有计算机和密码学基础的人解释如何在区块链上追溯和验证投票的正确性,基本上不可能。反而不如一个蚂蚁链发的可信存证证书来的实在,用户只要知道我的信息存证了,有证书、可验证。系统能做到能向监管机构证明,支持审计就可以了。

所以结合国内的区块链监管环境,我们选择用蚂蚁的可信存证链服务,虽然不是严格意义上的区块链投票,但是信息国内司法认可,用户对证书感知强烈,信息链上加密、不可篡改。

下图是我们的投票存证流程示例:

通过以上流程,做到了决议内容、投票人员、投票内容、投票结果全部上链存证。上链文件内容可通过文件原文和存证Hash到支付宝平台做验证,示例如下:

验证示例

遗留问题

  1. 国内在以太坊链上建应用合法吗?

以上是关于java做投票系统的主要内容,如果未能解决你的问题,请参考以下文章

java投票排名实现

帮忙用java做个投票系统,发到我邮箱

区块链投票系统概述

ASP动态投票系统

Java小项目之:投票系统

基于php116旅游在线人物投票系统