spring boot项目中,在其中一个方法中向Session中存入对象,在另一个方法中取出为null的问题

在Spring Boot项目中遇到一个问题,即在第一个方法中将验证码存入Session,但在第二个请求中取出时发现为null。原因是Vue不会自动保存后端返回的Cookie,导致服务器无法识别同一客户端的连续请求。解决方案是在Vue的main.js中添加代码处理Cookie,同时后端需设置跨域策略。参考了多个博客文章进行问题排查和解决。
摘要由CSDN通过智能技术生成

出问题时:此时,我想先把注册功能的验证码,先存入,Session域对象中,等用户点击注册按钮时,再取出Session中存入的验证码与浏览器的请求中传入的验证码,作比较,来验证,用户输入的验证是否正确,但在此两次请求中的方法的执行过程,先前存入Session对象中值,在第二次请求中,从Session中取时,却为null。

第一次请求,调用的方法

@RequestMapping("/sendMail")
public String sendMail(User user,HttpSession session) {
   
	String codes="123456789";
	StringBuffer sb=new StringBuffer("");
	
	Random random=new Random();
	
	for(int i=0;i<6;i++) {
   
		int index=random.nextInt(codes.length());
		char c=codes.charAt(index);
		sb.append(c);
	}
	String content=sb.toString();
	
	session
好的,下面是Java秒杀商品项目使用验证码防刷的具体代码实现: 1. 在前端页面上加入验证码组件,比如Google reCAPTCHA或者阿里云的验证码组件等等。这里以Google reCAPTCHA为例,前端代码如下: ``` <div class="g-recaptcha" data-sitekey="your_site_key"></div> ``` 2. 在后端控制器,对用户提交的验证码进行校验。如果验证码输入错误,则返回错误信息,防止用户恶意提交表单。这里以Spring Boot为例,后端代码如下: ```java import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; @Controller public class CaptchaController { @Autowired private DefaultKaptcha captchaProducer; @PostMapping("/checkCaptcha") @ResponseBody public Map<String, Object> checkCaptcha(HttpServletRequest request, HttpServletResponse response, @RequestBody Map<String, String> params) throws IOException { // 从请求参数获取验证码 String captcha = params.get("captcha"); // 从Session获取生成的验证码 String kaptcha = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY); // 对比验证码是否一致 Map<String, Object> result = new HashMap<>(); if (captcha == null || !captcha.equalsIgnoreCase(kaptcha)) { result.put("success", false); result.put("errMsg", "验证码输入错误!"); return result; } else { result.put("success", true); return result; } } @PostMapping("/captcha") public void captcha(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setHeader("Cache-Control", "no-store, no-cache"); response.setContentType("image/jpeg"); // 生成验证码 String text = captchaProducer.createText(); BufferedImage image = captchaProducer.createImage(text); // 将验证码存入Session request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, text); // 输出验证码图片 ServletOutputStream out = response.getOutputStream(); ImageIO.write(image, "jpg", out); try { out.flush(); } finally { out.close(); } } @Autowired public void setCaptchaProducer(DefaultKaptcha captchaProducer) { this.captchaProducer = captchaProducer; } } ``` 3. 在数据库对每个用户的IP地址和访问时间进行记录,如果发现某个IP地址在短时间内多次访问相同的商品页面,就认为该IP地址可能是恶意刷单,可以将该IP地址拉黑,禁止其继续访问。这里以Redis为例,后端代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service public class IpLimitService { private static final String IP_LIMIT_KEY_PREFIX = "ipLimit:"; @Autowired private RedisTemplate<String, Integer> redisTemplate; /** * 判断IP地址是否被限制访问 */ public boolean isIpLimited(String ip) { String key = IP_LIMIT_KEY_PREFIX + ip; Integer count = redisTemplate.opsForValue().get(key); if (count == null) { return false; } return count >= Constants.IP_LIMIT_THRESHOLD; } /** * 增加IP地址的访问次数 */ public void incrIpCount(String ip) { String key = IP_LIMIT_KEY_PREFIX + ip; Integer count = redisTemplate.opsForValue().get(key); if (count == null) { redisTemplate.opsForValue().set(key, 1, Constants.IP_LIMIT_DURATION, TimeUnit.SECONDS); } else { redisTemplate.opsForValue().increment(key, 1); } } } ``` 4. 对于高并发场景,可以使用分布式缓存来存储已经拉黑的IP地址,以减轻数据库的压力。这里以Redis为例,后端代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; @Service public class IpLimitService { private static final String IP_LIMIT_KEY_PREFIX = "ipLimit:"; private static final String BLACKLIST_KEY = "ipLimit:blacklist"; @Autowired private RedisTemplate<String, Integer> redisTemplate; /** * 判断IP地址是否被限制访问 */ public boolean isIpLimited(String ip) { String key = IP_LIMIT_KEY_PREFIX + ip; Integer count = redisTemplate.opsForValue().get(key); if (count == null) { return false; } if (count >= Constants.IP_LIMIT_THRESHOLD) { // 将IP地址添加到黑名单 redisTemplate.opsForSet().add(BLACKLIST_KEY, ip); return true; } return false; } /** * 判断IP地址是否在黑名单 */ public boolean isIpBlacklisted(String ip) { return redisTemplate.opsForSet().isMember(BLACKLIST_KEY, ip); } /** * 增加IP地址的访问次数 */ public void incrIpCount(String ip) { String key = IP_LIMIT_KEY_PREFIX + ip; Integer count = redisTemplate.opsForValue().get(key); if (count == null) { redisTemplate.opsForValue().set(key, 1, Constants.IP_LIMIT_DURATION, TimeUnit.SECONDS); } else { redisTemplate.opsForValue().increment(key, 1); } } } ``` 以上就是Java秒杀商品项目使用验证码防刷的具体代码实现,供您参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值