日期:2014-05-17  浏览次数:20698 次

投票限制次数的问题??
看了下面的帖子
http://zds420.iteye.com/blog/1244446

说是用COOKIE IP地址限制投票次数,它好像是写在jsp页面里面的,不太懂,他给的不完全,不太明白他代码的意思,
是不是还要在数据库里面设计一个ip的字段,然后怎么去限制用户投票的次数啊 。

------解决方案--------------------
常用的投票验证方法:
IP验证、Cookies验证、Session验证,多种混合验证。

以上任何一种验证方法都无法屏蔽刷票机,唯有通过注册用户名,并通过邮箱激活用户名后方可投票,一个用户名只能投一票的方法才能避免机器刷票,但这种方法对用户来说是非常麻烦的。


通过IP、Cookies混合验证方式:

当投票时,在JSP里面获得用户的IP地址、Cookies,然后将IP地址与数据库中的IP地址进行判断,如果数据库中已存在这个IP地址(也就是投过票了),则提示已投过票;IP不同的话,继续进行Cookes验证,首次投票时,设置Cookies的值,当再次投票时,获取Cookies的值进行对比。

数据库字段一般设置
id 自动编号
IP 投票的IP地址
voteId 投票项的Id号
voteTime 投票时间
------解决方案--------------------
直接在服务端获取用户的ip 
判断ip投过票就不让投了啊

cookie什么的,都在本地是可以被模拟的,不安全
------解决方案--------------------
当初的JSP网上投票系统也是一个IP30分钟允许投一次。。做法和一楼的类似,但是多了个“下一次投票时间”的字段
------解决方案--------------------
Java code

public class VoteLimitFilter implements Filter {

    private FilterConfig fc = null;

    private VoterDao voterDao;

    public void doFilter(ServletRequest srequest, ServletResponse sresponse,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) srequest;
        HttpServletResponse response = (HttpServletResponse) sresponse;
        HttpSession session = request.getSession();

        String dispatch = request.getParameter("dispatch");
        String titleId =request.getParameter("titleId");
        //白名单
        List<String> whitelist = new ArrayList<String>();
        whitelist.add("insertOrUpdateTitle");
        whitelist.add("checkVoteById");
        whitelist.add("showTitleList");
        whitelist.add("prepareNew");
        whitelist.add("showVoteResult");
        whitelist.add("prepareInsertItem");
        whitelist.add("getTitleById");
        whitelist.add("getOptionById");
        whitelist.add("updateItem");
        whitelist.add("insertItem");
        whitelist.add("deleteVote");
        whitelist.add("getVoterList");
        
        
        if(!whitelist.contains(dispatch)){
            String ip = request.getRemoteAddr(); // 获取客户端IP
            int optionid = 1;
            // //获取选择的选项ID
            try {
                Date now = new Date(); // 获取当前时间
                Date last = voterDao.getLastVoteTime(ip,Integer.parseInt(titleId)); // 获取该IP的上次对该标题的投票时间
                if (last == null) { // 数据库中没有记录该IP,则该IP地址没有投过票
                    addCookie(request, response,titleId); // 在客户端的cookie中添加该用户投票记录
                    Voter voter = new Voter();
                    voter.setVote_title(Integer.parseInt(titleId));
                    voter.setVoter_Ip(ip);
                    voter.setVoter_option(optionid);
                    voter.setVote_time(StringUtil.timeTostr(now));
                    voterDao.saveVoteTime(voter); // 在数据库中记录该IP、选择的选项ID和投票时间
                    chain.doFilter(request, response);
                } else { // 该IP地址投过票,则接着判断客户端cookie中是否记录了用户投票情况(用来解决局域网中某个ip投票后,其他ip不能再进行投票的问题)
                    boolean voteincookie = seeCookie(request); // 判断当前使用该IP的用户的客户端的cookie中是否记录了投票标记
                    if (voteincookie) { // 如果记录了该用户已经投过票
                        request.setAttribute("message",
                                "● 您已经投过票了,1小时内不允许重复投票!");
                        RequestDispatcher rd = request
                                .getRequestDispatcher("fail.jsp");
                        rd.forward(request, response);
                    } else {