From 4bab424d551fa27274b073ca22d8f89f5271c5fe Mon Sep 17 00:00:00 2001 From: ssl <1151868461@qq.com> Date: Tue, 9 May 2023 23:54:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=B7=BB=E5=8A=A0ip=E9=AA=8C?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/user/ActivityController.java | 1 + .../controller/user/VoteRecordController.java | 11 ++-- .../com/votesystem/ssl/dao/ActivityDAO.java | 3 +- .../java/com/votesystem/ssl/dao/UserDAO.java | 4 +- .../com/votesystem/ssl/pojo/Activity.java | 2 + .../ssl/service/IVoteRecordService.java | 6 +- .../ssl/service/impl/UserServiceImpl.java | 3 + .../service/impl/VoteRecordServiceImpl.java | 65 +++++++++++++++++-- 8 files changed, 81 insertions(+), 14 deletions(-) diff --git a/vote/src/main/java/com/votesystem/ssl/controller/user/ActivityController.java b/vote/src/main/java/com/votesystem/ssl/controller/user/ActivityController.java index f8210ea..7a8d11b 100644 --- a/vote/src/main/java/com/votesystem/ssl/controller/user/ActivityController.java +++ b/vote/src/main/java/com/votesystem/ssl/controller/user/ActivityController.java @@ -70,6 +70,7 @@ public class ActivityController { @PutMapping("/admin/activity/{activityId}") public Result updateActivity(@PathVariable("activityId") String activityId, @RequestBody Activity activity){ + log.info("===============>",String.valueOf(activity.isIpRestrict())); return activityService.updateActivity(activityId,activity); } } diff --git a/vote/src/main/java/com/votesystem/ssl/controller/user/VoteRecordController.java b/vote/src/main/java/com/votesystem/ssl/controller/user/VoteRecordController.java index 8108c79..8c6eac2 100644 --- a/vote/src/main/java/com/votesystem/ssl/controller/user/VoteRecordController.java +++ b/vote/src/main/java/com/votesystem/ssl/controller/user/VoteRecordController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.*; import com.votesystem.ssl.result.Result; import com.votesystem.ssl.service.IVoteRecordService; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; @@ -32,16 +33,18 @@ public class VoteRecordController { @PostMapping(value = {"/vote/single/{captcha}/{captcha_key}","/vote/single/{captcha_key}"}) public Result singleVote(@PathVariable(value = "captcha",required = false) String captcha, @PathVariable(value = "captcha_key",required = false) String captchaKey, - @RequestBody VoteRecord voteRecord){ - return voteRecordService.singleVote(captcha,captchaKey,voteRecord); + @RequestBody VoteRecord voteRecord, + HttpServletRequest request){ + return voteRecordService.singleVote(captcha,captchaKey,voteRecord,request); } @PostMapping(value = {"/vote/multiple/{captcha}/{captcha_key}","/vote/multiple/{captcha_key}"}) public Result multipleVote(@PathVariable(value = "captcha",required = false) String captcha, @PathVariable(value = "captcha_key",required = false) String captchaKey, - @RequestBody JSONObject voteData){ + @RequestBody JSONObject voteData, + HttpServletRequest request){ log.info("voteData === > ",voteData); - return voteRecordService.multipleVote(captcha,captchaKey,voteData); + return voteRecordService.multipleVote(captcha,captchaKey,voteData,request); } //导出为Excel diff --git a/vote/src/main/java/com/votesystem/ssl/dao/ActivityDAO.java b/vote/src/main/java/com/votesystem/ssl/dao/ActivityDAO.java index 92389a3..2ffe9c7 100644 --- a/vote/src/main/java/com/votesystem/ssl/dao/ActivityDAO.java +++ b/vote/src/main/java/com/votesystem/ssl/dao/ActivityDAO.java @@ -70,8 +70,7 @@ public interface ActivityDAO extends JpaRepository, JpaSpecific // @Update("UPDATE `tb_acticity` SET `state` = '0' WHERE `id` = #{activityId,jdbcType=VARCHAR}") // int deleteActivityByState(String activityId); // @Select("SELECT * FROM tb_activity WHERE id = #{activityId}") -// Activity findOneById(String activityId); -// // 你这几句都没写对应的SQL语句。 +// Activity findOneById(String activityId);。 // @Select("SELECT * FROM tb_activity") // Page findAll(Pageable pageable); // @Select( "select * from tb_activity a where a.state = '2'") diff --git a/vote/src/main/java/com/votesystem/ssl/dao/UserDAO.java b/vote/src/main/java/com/votesystem/ssl/dao/UserDAO.java index 4d91cda..522921f 100644 --- a/vote/src/main/java/com/votesystem/ssl/dao/UserDAO.java +++ b/vote/src/main/java/com/votesystem/ssl/dao/UserDAO.java @@ -39,5 +39,7 @@ public interface UserDAO extends JpaRepository, JpaSpecificationExe @Query(value = "select new User(u.id,u.userName,u.avatar,u.email,u.state,u.createTime,u.updateTime) from User as u") Page listAllUser(Pageable pageable); - + @Modifying + @Query(nativeQuery = true, value = "UPDATE `tb_user` SET `login_ip` = ? WHERE `id` = ? ") + int updateLoginIPById(String loginIp,int userId); } diff --git a/vote/src/main/java/com/votesystem/ssl/pojo/Activity.java b/vote/src/main/java/com/votesystem/ssl/pojo/Activity.java index 52bf3b6..eb72a06 100644 --- a/vote/src/main/java/com/votesystem/ssl/pojo/Activity.java +++ b/vote/src/main/java/com/votesystem/ssl/pojo/Activity.java @@ -39,6 +39,8 @@ public class Activity { private Date createTime; @Column(name = "update_time") private Date updateTime; + @Column(name = "ip_restrict") + private boolean ipRestrict; } diff --git a/vote/src/main/java/com/votesystem/ssl/service/IVoteRecordService.java b/vote/src/main/java/com/votesystem/ssl/service/IVoteRecordService.java index c5b3594..d488656 100644 --- a/vote/src/main/java/com/votesystem/ssl/service/IVoteRecordService.java +++ b/vote/src/main/java/com/votesystem/ssl/service/IVoteRecordService.java @@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSONObject; import com.votesystem.ssl.pojo.VoteRecord; import com.votesystem.ssl.result.Result; +import javax.servlet.http.HttpServletRequest; + public interface IVoteRecordService { - Result singleVote(String captcha, String captchaKey, VoteRecord voteRecord); + Result singleVote(String captcha, String captchaKey, VoteRecord voteRecord, HttpServletRequest request); - Result multipleVote(String captcha,String captchaKey,JSONObject voteData); + Result multipleVote(String captcha,String captchaKey,JSONObject voteData, HttpServletRequest request); } diff --git a/vote/src/main/java/com/votesystem/ssl/service/impl/UserServiceImpl.java b/vote/src/main/java/com/votesystem/ssl/service/impl/UserServiceImpl.java index df9a3d7..7597735 100644 --- a/vote/src/main/java/com/votesystem/ssl/service/impl/UserServiceImpl.java +++ b/vote/src/main/java/com/votesystem/ssl/service/impl/UserServiceImpl.java @@ -390,6 +390,9 @@ public class UserServiceImpl extends BaseService implements IUserService { usernamePasswordToken.setRememberMe(true); try { subject.login(usernamePasswordToken); + userDAO.updateLoginIPById( + request.getRemoteAddr(), + userDAO.findOneByUserName(userName).getId()); // 更新登录IP地址 log.info("doLogin == success == userName == > " + userName); return ResultFactory.buildSuccessResult(userName); } catch (Exception e) { diff --git a/vote/src/main/java/com/votesystem/ssl/service/impl/VoteRecordServiceImpl.java b/vote/src/main/java/com/votesystem/ssl/service/impl/VoteRecordServiceImpl.java index c8c68d2..84c2fbb 100644 --- a/vote/src/main/java/com/votesystem/ssl/service/impl/VoteRecordServiceImpl.java +++ b/vote/src/main/java/com/votesystem/ssl/service/impl/VoteRecordServiceImpl.java @@ -4,9 +4,11 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.votesystem.ssl.dao.ActivityDAO; import com.votesystem.ssl.dao.CandidateDAO; +import com.votesystem.ssl.dao.UserDAO; import com.votesystem.ssl.dao.VoteRecordDAO; import com.votesystem.ssl.pojo.Activity; import com.votesystem.ssl.pojo.Candidate; +import com.votesystem.ssl.pojo.User; import com.votesystem.ssl.pojo.VoteRecord; import com.votesystem.ssl.utils.Constants; import com.votesystem.ssl.utils.RedisUtils; @@ -20,10 +22,9 @@ import com.votesystem.ssl.service.IVoteRecordService; import com.votesystem.ssl.utils.IdWorker; import com.votesystem.ssl.utils.TextUtils; +import javax.servlet.http.HttpServletRequest; import javax.transaction.Transactional; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; @Slf4j @Service @@ -50,13 +51,49 @@ public class VoteRecordServiceImpl implements IVoteRecordService { @Autowired RedisUtils redisUtils; + @Autowired + UserDAO userDAO; + + private boolean isInIpRestrictAddress(VoteRecord voteRecord,String ipAddress,long time){ + Map aidMap = (Map) redisUtils.get(ipAddress); + +// Map ipMap = (Map) redisUtils.get(ipAddress); + if (aidMap == null){ + aidMap = new HashMap<>(); + } +// User user = userDAO.findOneById(voteRecord.getUid()); //获取用户 + if (aidMap.containsKey(voteRecord.getAid())){ + return true; + } else { + aidMap.put(voteRecord.getAid(),ipAddress); + redisUtils.set(ipAddress,aidMap,time); + } + return false; + } + private boolean isInIpRestrictAddress(String aid,String ipAddress,long time){ + Map aidMap = (Map) redisUtils.get(ipAddress); + +// Map ipMap = (Map) redisUtils.get(ipAddress); + if (aidMap == null){ + aidMap = new HashMap<>(); + } +// User user = userDAO.findOneById(voteRecord.getUid()); //获取用户 + if (aidMap.containsKey(aid)){ + return true; + } else { + aidMap.put(aid,ipAddress); + redisUtils.set(ipAddress,aidMap,time); + } + return false; + } + /** * 单选 * @param voteRecord * @return */ @Override - public Result singleVote(String captcha, String captchaKey, VoteRecord voteRecord) { + public Result singleVote(String captcha, String captchaKey, VoteRecord voteRecord, HttpServletRequest request) { //1.根据aid 获取活动 ===》 根据活动获取类型 Activity activity = activityDAO.findOneById(voteRecord.getAid());//获取活动 @@ -83,6 +120,15 @@ public class VoteRecordServiceImpl implements IVoteRecordService { redisUtils.del(Constants.User.KEY_CAPTCHA_CONTENT + captchaKey); } } + // ip验证 + if(activity.isIpRestrict()||true){ + if(isInIpRestrictAddress( + voteRecord.getAid(), + request.getRemoteAddr(), + 24*60*60)) { + return ResultFactory.buildFailResult("该IP已投过票"); + } + } //4.如果是非周期性投票 if(typeMap.get("cycleType").equals("false")){ int userTotalVotes = voteRecordDAO.countByAidAndUid(activity.getId(),voteRecord.getUid()); @@ -126,7 +172,7 @@ public class VoteRecordServiceImpl implements IVoteRecordService { } @Override - public Result multipleVote(String captcha,String captchaKey,JSONObject voteData) { + public Result multipleVote(String captcha,String captchaKey,JSONObject voteData ,HttpServletRequest request) { log.info("voteData ==== > ",voteData); JSONObject jsonObject = voteData.getJSONObject("voteData"); //根据活动id 获取活动 @@ -157,6 +203,15 @@ public class VoteRecordServiceImpl implements IVoteRecordService { redisUtils.del(Constants.User.KEY_CAPTCHA_CONTENT + captchaKey); } } +// ip验证 +// if(activity.isIpRestrict()){ +// if(isInIpRestrictAddress( +// aid, +// request.getRemoteAddr(), +// 24*60*60)) { +// return ResultFactory.buildFailResult("该IP已投过票"); +// } +// } //判断是否是周期性投票 //1.非周期性投票 if(typeMap.get("cycleType").equals("false")){