第一种:

导入jar包com.github.axet生成法

①导包
<dependency><groupId>com.github.axet</groupId><artifactId>kaptcha</artifactId><version>0.0.9</version></dependency>
②创建配置类,用来配置验证码的生成

配置类

@Configuration
public class KaptchaConfig {@Beanpublic DefaultKaptcha producer(){Properties properties = new Properties();//(选择性的设置,不是每个都需要设置)//是否需要外边框(yes,no)properties.put("kaptcha.border","yes");//边框厚度,合法值:>0properties.put("kaptcha.border.thickness","2");//框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blueproperties.put("kaptcha.border.color","blue");//字体颜色 properties.put("kaptcha.textproducer.font.color","black");//渲染效果:水纹:WaterRipple;鱼眼:FishEyeGimpy;阴影:ShadowGimpy// properties.put("kaptcha.obscurificator.impl","com.google.code.kaptcha.impl.FishEyeGimpy");//配置干扰线--噪点(只改变最后一个单词:NoNoise,DefaultNoise)properties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.DefaultNoise");//干扰 颜色,合法值: r,g,b 或者 white,black,blue.properties.put("kaptcha.noise.color","yellow");//设置图片及字体properties.put("kaptcha.image.width","90");properties.put("kaptcha.image.height","33");properties.put("kaptcha.textproducer.font.size","25");//生成验证码的长度(也就是要几个字)properties.put("kaptcha.textproducer.char.length","4");//文字间隔properties.put("kaptcha.textproducer.char.space","5");//和登录框背景颜色一致//背景颜色渐变,开始颜色properties.put("kaptcha.background.clear.from","247,247,247");//背景颜色渐变, 结束颜色properties.put("kaptcha.background.clear.to","247,247,247");properties.put("kaptcha.word.impl","com.google.code.kaptcha.text.impl.DefaultWordRenderer");Config config = new Config(properties);DefaultKaptcha defaultKaptcha = new DefaultKaptcha();defaultKaptcha.setConfig(config);return defaultKaptcha;}
}

控制类

③调用图片生成的类(一般为Controller层)
@Controller
@RequestMapping("/producer")
public class KaptchaController {@Autowiredprivate Producer producer;@RequestMapping("/kaptcha")public void produceKaptcha(HttpServletRequest request, HttpServletResponse response) throws Exception{response.setHeader("Cache-Control", "no-store, no-cache");response.setContentType("image/jpeg");//生成文字验证码String text = producer.createText();System.out.println(text);/***在此处做text的缓存,方便登陆校验* 例如:HttpSession session=re.getSession();*     session.setAttribute("code", sb.toString());**///生成图片验证码BufferedImage image = producer.createImage(text);ServletOutputStream out = response.getOutputStream();ImageIO.write(image,"jpg",out);}}

第二种:自己编写验证码生成的方

①控制层(调用处的编写)

控制层

@RequestMapping("/selfdefinitionkaptcha")public void selfDefinitionKaptcha(HttpServletResponse response) throws Exception{Object[] objs = CreateKaptcha.createImage();String text = (String) objs[0];/*** 缓存验证码*ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);*/BufferedImage image =(BufferedImage) objs[1];response.setHeader("Cache-Control", "no-store, no-cache");response.setContentType("image/jpeg");ServletOutputStream out = response.getOutputStream();ImageIO.write(image, "png", out);}

②验证码生成类

public class CreateKaptcha {// 验证码字符集private static final char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N','O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};private static Map<String,String> map = new HashMap<String,String>();private static List<String> list= new ArrayList<String>();static{map.put("李白的女儿","李紫嫣");map.put("31*51=?", "1581");map.put("潘金莲的老公", "武大郎");map.put("dnf外号", "毒奶粉");map.put("你是猪吗", "是");map.put("光头强职业", "伐木工");map.put("床前明月光","疑是地上霜");map.put("天王盖地虎","宝塔镇河妖");Set<String> set=map.keySet();for(String s:set){list.add(s);}set=null;}// 字符数量private static final int SIZE = 4;// 干扰线数量private static final int LINES = 5;// 宽度private static final int WIDTH = 130;// 高度private static final int HEIGHT = 35;// 字体大小private static final int FONT_SIZE =15;/*** 生成随机验证码及图片*/public static Object[] createImage() {StringBuffer sb = new StringBuffer();// 1.创建空白图片BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);// 2.获取图片画笔Graphics graphic = image.getGraphics();// 3.设置画笔颜色graphic.setColor(Color.LIGHT_GRAY);// 4.绘制矩形背景graphic.fillRect(0, 0, WIDTH, HEIGHT);// 5.画随机字符Random ran = new Random();if(ran.nextInt(2)==0){for (int i = 0; i <SIZE; i++) {// 取随机字符索引int n = ran.nextInt(chars.length);// 设置随机颜色graphic.setColor(getRandomColor());// 设置字体大小int size=(ran.nextInt(15)+FONT_SIZE);graphic.setFont(new Font(null, Font.ITALIC,size ));// 画字符graphic.drawString(chars[n] + "", i * WIDTH /SIZE, HEIGHT/2+5);// 记录字符sb.append(chars[n]);}}else{String key = list.get(ran.nextInt(list.size()));char[] cha = key.toCharArray();graphic.setColor(new Color(0,0,0));for(int i=0;i<cha.length;i++){int size = WIDTH/cha.length-2;graphic.setFont(new Font(null,Font.ITALIC+1,size));graphic.drawString(cha[i]+"", i * WIDTH/cha.length, HEIGHT/2+5);}char[] value=map.get(key).toCharArray();for(int i=0;i<value.length;i++){sb.append(value[i]);}}// 6.画干扰线for (int i = 0; i < LINES; i++) {// 设置随机颜色graphic.setColor(getRandomColor());// 随机画线graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),ran.nextInt(WIDTH), ran.nextInt(HEIGHT));}// 7.返回验证码和图片return new Object[]{sb.toString(), image};}/*** 随机取色*/public static Color getRandomColor() {Random ran = new Random();Color color = new Color(ran.nextInt(256),ran.nextInt(256), ran.nextInt(256));return color;}
}

总结:

1.第一种更简单,第二种效果更好,更容易控制。也可以做更多花样,比如:加减乘除,唐诗宋词,都可以。
我更爱第二种。
2.两种方法对验证码的缓存采用了两种不同方法,需上心。ShiroUtils.setSessionAttribute()需要使用shiro

java制作验证码(kaptcha)的两种方法相关推荐

  1. java 匿名list,java创造匿名对象的两种方法

    在java中有时候需要一些匿名对象的使用.可能有些小伙伴拿还不会创造,其实我们在学习一些方法时都或多或少的接触过.本篇所要讲到的创造匿名对象总结了两种方法,分别是静态工具方法和Lambda表达式,我们 ...

  2. unity 2D游戏开发 制作帧动画的两种方法

    本小主在这里给大家分享一下unity 2D游戏开发中制作帧动画的两种方法. 比较简单,一学即会. 方法一: 是用代码控制: 先创建一个2D工程.导入图片资源,并设置texture的texture ty ...

  3. BIGEMAP使用Unity3D制作真实地形的两种方法

    使用Unity3D制作真实地形的两种方法: 1.在SceneView中使用height tools直接绘制: 2.使用外部工具制作的heightmaps: 具体操作如下: 1.准备一块DEM数据,格式 ...

  4. 使用Unity3D制作真实地形的两种方法

    使用Unity3D制作真实地形的两种方法: 1.在SceneView中使用height tools直接绘制: 2.使用外部工具制作的heightmaps: 具体操作如下: 1.准备一块DEM数据,格式 ...

  5. Unity中ugui如何制作不规则按键的两种方法

    Unity中ugui如何制作不规则按键的两种方法 两种不同的方案 目前,关于这个问题如何,解决通过搜索引擎我们能找到两种不同的方案: 多边形碰撞器: 该方法是指给精灵(Sprite)添加一个多边形碰撞 ...

  6. JAVA中初始化线程的两种方法_java中最简单的方式新起一个线程

    启动一个线程 在一个方法中启动一个线程,有两种方法 第一种是让类实现Runable接口,这样的话编译器就会提示你实现里面的未实现的方法(就是run方法) 第二种是,现在方法中new一个线程,然后直接调 ...

  7. 实现JAVA时间加减的两种方法

    JAVA的时间加减 1.获取当前系统时间 Date date = new Date(); 2.实现时间的加减的两种方法 第一种: 用java.text.SimpleDateFormat来实现 Simp ...

  8. Apache Software Foundation Thinking in Java:只要仔细审视,两种方法的使用场合应该是相当明显的

    引论 : 对于继承可能会引发某种争论:继承应该只重载基类的方法(而并不添加在基类中没有的新方法)吗?如果这样做,就意味着导出类和基类是完全相同的类型,因为它们具有完全相同的接口.结果你可以用一个导出类 ...

  9. Unity制作自定义字体的两种方法

    Unity支持自定义图片字体(CustomFont),网上有很多教程,细节不尽相同,当概括起来基本就是两种方式.一是使用BMFont,导出图集和.fnt文件,再使用图集在Unity中设置得到字体.二是 ...

  10. java登录代码带验证码实现_两种方法实现带验证码的用户登录

    带验证码的登录效果图 登录成功时,记录用户名和访问次数 登录失败,弹出错误提示 方法一:应用request对象获取表单数据实现登录操作 代码结构: index.jsp源码及详解: 当表单被提交时,数据 ...

最新文章

  1. 贾跃亭晒FF 91新图,“生态化反”到底凉没凉?
  2. 虚幻4的关卡动态加载机制
  3. jmeter定时器的使用_jmeter压测学习30定时器之固定定时器(sleep等待时间)
  4. Kafka- Spark消费Kafka
  5. boost::coroutine2模块实现斐波那契数列的测试程序
  6. InfoVista.NET 内部数据格式简介
  7. gcc-5.4.0 static dwarf2 compile
  8. 第1次作业:阅读优秀博文谈感想
  9. upc 9519 New Game
  10. JavaWEB/JSP 中简单的验证码 springMVC
  11. 《TCP/IP详解》读书笔记
  12. char类型怎么输入 c语言_c语言入门(一)
  13. EasyUI的datagrid每行数据添加操作按钮的方法
  14. n160ii打印机查看ip地址_芯烨ip地址设定软件下载|
  15. xshell远程登录工具的星号密码查看方法
  16. HHL论文第三弹(参数讨论)
  17. opencv GPU加速 多GPU卡指定GPU索引方法
  18. 如何用数据说话-《数据化决策(美)道格拉斯·W.哈伯德》笔记与心得
  19. vue2中的watch监听
  20. 大数据算法MOOC笔记1:大数据定义、特点、应用

热门文章

  1. 因为相信所以看见,既然看见注定坚信《9》
  2. ViewFlipper的使用例子
  3. 格式化工具indent使用笔记
  4. 数字,字母,汉字的校验
  5. 华为小熊派开发记录STM32+MPU6050+WIFI8266
  6. 北京交通大学计算机系2018年录取情况,北京交通大学2018年高招录取分数统计(陆续更新中)...
  7. 使用cos-js-sdk-v5腾讯云实现cos文件上传
  8. 基于Sqli-Labs靶场的SQL注入-第五关(重点讲双查询注入)
  9. 神经网络变得轻松(第二部分):网络训练和测试
  10. ie浏览器设置文档模式