81,092
社区成员
发帖
与我相关
我的任务
分享
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 {
// 没有记录该用户是否投过票,则接着判断当前session中是否记录了用户投票的情况
// (用来解决用户投票后,删除本地cookie实现重复投票)
// 用来解决用户投票后,删除本地cookie实现重复投票
String ido = (String) session.getAttribute("ido");
if ("yes".equals(ido)) { // 当前用户已投过票
request.setAttribute("message",
"● 您已经投过票了,1小时内不允许重复投票!");
RequestDispatcher rd = request
.getRequestDispatcher("fail.jsp");
rd.forward(request, response);
} else {
addCookie(request, response,titleId); // 在客户端的cookie中记录该用户已经投过票
Voter voter = new Voter();
voter.setVote_title(6);
voter.setVoter_Ip(ip);
voter.setVoter_option(optionid);
voter
.setVote_time(StringUtil
.timeTostr(now));
voterDao.saveVoteTime(voter);
voterDao.saveVoteTime(voter); // 记录使用该IP的用户的投票时间
session.setAttribute("ido", "yes");
chain.doFilter(request, response);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}else{
chain.doFilter(request, response);
}
}
private boolean seeCookie(HttpServletRequest request) {
boolean hasvote = false;
String webName = request.getContextPath();
webName = webName.substring(1);
String cookiename = webName + ".voter";
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length != 0) {
for (int i = 0; i < cookies.length; i++) {
Cookie single = cookies[i];
if (single.getName().equals(cookiename)
&& single.getValue().equals("I Have Vote")) {
hasvote = true;
break;
}
}
}
return hasvote;
}
private void addCookie(HttpServletRequest request,
HttpServletResponse response,String titleId) {
String webname = request.getContextPath();
webname = webname.substring(1);
Cookie cookie = new Cookie(webname + titleId+ ".voter", "I Have Vote"); // 创建一个cookie
cookie.setPath("/");
// setMaxAge 以秒为单位。
cookie.setMaxAge(60 * 60 * 1); // 设置cookie在客户端保存的有效时间为1小时
response.addCookie(cookie); // 向客户端写入cookie
}
public void init(FilterConfig fc) throws ServletException {
this.fc = fc;
WebApplicationContext wac = WebApplicationContextUtils
.getRequiredWebApplicationContext(fc.getServletContext());
voterDao = (VoterDao) wac.getBean("voterDao");
}
public void destroy() {
this.fc = null;
}
}