负载均衡下通过自定义CaptchaCache集中缓存图片验证码

同一项目部署到多个tomcat,用一个 nginx 做了负截,具体服务请求到了哪个服务器不知道的情况下,不作处理最直接的问题是图片验证码和session会出现问题。

session问题可以通过配置nginx的ip_hash解决;

图片验证码问题是通过波总的指导了解到可以使用自定义CaptchaCache来集中缓存图片验证码。在此再次感谢波总!

下面上代码

public class MyCaptchaCache extends CaptchaCache {
	
	@Override
	public void put(Captcha captcha) {
		//储存你的验证码 可以储存到数据库或者redis
		//我的做法是储存在数据库内
		Record record = new Record();
		record.set("key", captcha.getKey());
		record.set("value", captcha.getValue());
		record.set("expireAt", captcha.getExpireAt());
		Db.save("comm_captcha", record);
	}
	
	@Override
	public Captcha get(String key) {
	        //从数据库内取出验证码
		Record record = Db.findFirst("select * from comm_captcha where key=? order by id desc", key);
		Captcha captcha = new Captcha(record.getStr("key"), record.getStr("value"));
		return captcha;
	}
	
	@Override
	public void remove(String key) {
		//删除验证码
		Record record = Db.findFirst("select * from comm_captcha where key=?", key);
		Db.deleteById("comm_captcha", record.getInt("id"));
	}
}


最后在config内配置

me.setCaptchaCache(new MyCaptchaCache());


评论区

JFinal

2018-11-07 18:25

代码十分简洁,功能很实用,感谢分享

此外,建议几个改进:
1: 去掉所有 super 调用,例如: super.put(captcha); super.remove(key), 因为 super 的实在这种情况下应该完全抛弃

2:可以将继承 CaptchaCache 改成实现 ICaptchaCache 接口,这样也就没有 super 可以调用了

3: record.set("[Key]",...) 中的参数建议改成 "Key" , 不要加中括号

4:数据库字段名建议用符合 java 变量名规范的驼峰式

7479chen

2018-11-07 20:45

@JFinal 好的,谢谢波总

JFinal

2018-11-08 09:23

@7479chen 在这个贴子上改一下就好,进入个人空间可以修改主这个贴子:
http://www.jfinal.com/my/share

此外,继承 CaptchaCache 而不是实现 ICaptchaCache,我想起来一个好处,因为 CaptchaCache 有个定时器,可以定时清掉过期的验证码,可以利用一下

7479chen

2018-11-08 10:21

热门分享

扫码入社