一、编写生成英文,数字和中文混合的彩色验证码的Servlet实现类

(1)创建名称为PictureCheckCode.java的Servlet。

public class PictureCheckCode extends HttpServlet {public PictureCheckCode() {super();}public void destroy() {super.destroy(); }public void init() throws ServletException {super.init();}public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    } }   

(2)编写随机生成RGB颜色的方法getRandColor()

// 获取随机颜色public Color getRandColor(int s, int e) {Random random = new Random();if (s > 255) s = 255;if (e > 255) e = 255;int r = s + random.nextInt(e - s);        //随机生成RGB颜色中的r值int g = s + random.nextInt(e - s);        //随机生成RGB颜色中的g值int b = s + random.nextInt(e - s);        //随机生成RGB颜色中的b值return new Color(r, g, b);}

(3)在Service()方法中编写生成彩色验证码的代码

public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "No-cache");response.setDateHeader("Expires", 0);// 指定生成的响应是图片response.setContentType("image/jpeg");int width = 86;int height = 22;BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();Graphics2D g2d = (Graphics2D) g;Random random = new Random();Font mFont = new Font("黑体", Font.BOLD, 17);g.setColor(getRandColor(200, 250));g.fillRect(0, 0, width, height);g.setFont(mFont);g.setColor(getRandColor(180, 200));// 画随机的线条for (int i = 0; i < 100; i++) {int x = random.nextInt(width - 1);int y = random.nextInt(height - 1);int x1 = random.nextInt(6) + 1;int y1 = random.nextInt(12) + 1;BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);Line2D line = new Line2D.Double(x, y, x + x1, y + y1);g2d.setStroke(bs);g2d.draw(line);}String sRand = "";// 输出随机的验证文字String ctmp = "";int itmp = 0;for (int i = 0; i < 4; i++) {//random = new Random(new java.util.Date().getTime() + i);switch (random.nextInt(4)) {case 1:itmp = random.nextInt(26) + 65; // 生成A~Z的字母ctmp = String.valueOf((char) itmp);break;case 2: // 生成汉字String[] rBase = { "0", "1", "2", "3", "4", "5", "6", "7", "8","9", "a", "b", "c", "d", "e", "f" };// 生成第1位的区码int r1 = random.nextInt(3) + 11;    //生成11到14之间的随机数String str_r1 = rBase[r1];// 生成第2位的区码int r2;if (r1 == 13) {r2 = random.nextInt(7);            //生成0到7之间的随机数} else {r2 = random.nextInt(16);        //生成0到16之间的随机数
                }String str_r2 = rBase[r2];// 生成第1位的位码int r3 = random.nextInt(6) + 10;    //生成10到16之间的随机数String str_r3 = rBase[r3];// 生成第2位的位码int r4;if (r3 == 10) {r4 = random.nextInt(15) + 1;    //生成1到16之间的随机数} else if (r3 == 15) {r4 = random.nextInt(15);        //生成0到15之间的随机数} else {r4 = random.nextInt(16);        //生成0到16之间的随机数
                }String str_r4 = rBase[r4];System.out.println(str_r1 + str_r2 + str_r3 + str_r4);// 将生成机内码转换为汉字byte[] bytes = new byte[2];//将生成的区码保存到字节数组的第1个元素中String str_r12 = str_r1 + str_r2;int tempLow = Integer.parseInt(str_r12, 16);bytes[0] = (byte) tempLow;//将生成的位码保存到字节数组的第2个元素中String str_r34 = str_r3 + str_r4;int tempHigh = Integer.parseInt(str_r34, 16);bytes[1] = (byte) tempHigh;ctmp = new String(bytes);    //根据字节数组生成汉字
//                System.out.println("生成汉字:" + ctmp);break;default:itmp = random.nextInt(10) + 48; // 生成0~9的数字ctmp = String.valueOf((char) itmp);break;}sRand += ctmp;Color color = new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110));g.setColor(color);/** **随机缩放文字并将文字旋转指定角度* */// 将文字旋转指定角度Graphics2D g2d_word = (Graphics2D) g;AffineTransform trans = new AffineTransform();trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 8, 7);// 缩放文字float scaleSize = random.nextFloat() +0.8f;if (scaleSize > 1f)    scaleSize = 1f;trans.scale(scaleSize, scaleSize);g2d_word.setTransform(trans);/** ********************* */g.drawString(ctmp, 15 * i + 18, 14);}// 将生成的验证码保存到Session中HttpSession session = request.getSession(true);session.setAttribute("randCheckCode", sRand);g.dispose();ImageIO.write(image, "JPEG", response.getOutputStream());}

二、配置servlet

<servlet><description>This is the description of my J2EE component</description><display-name>This is the display name of my J2EE component</display-name><servlet-name>PictureCheckCode</servlet-name><servlet-class>com.PictureCheckCode</servlet-class></servlet><servlet-mapping><servlet-name>PictureCheckCode</servlet-name><url-pattern>/PictureCheckCode</url-pattern></servlet-mapping>

转载于:https://www.cnblogs.com/xiaojiaohuazi/archive/2013/04/02/2995717.html

英文.数字和中文混合的彩色验证码【JSP】相关推荐

  1. 英文,数字和中文混合的彩色验证码实现

    功能描述:英文,数字和中文混合的彩色验证码是一种比较安全的验证码,虽然这样的验证码会给用户输入带来不便,但对于保障用户账号的安全还是值得的.本实例介绍实现英文,数字和中文混合验证码的彩色验证码的方法, ...

  2. js 中文英文数字首字母混合排序

    日常开发中可能会遇到以下类似数组的首字母排序问题 ['王宇', '金大','2liu', 'Jim', '阿雅', '赵大', '1liu', 'bim', 'uim', '金二', 'vim'] 排 ...

  3. elementui 表格英文加数字排序_解决vue elementUI中table里数字、字母、中文混合排序问题...

    1.使用场景 使用elementUI中的table时,给包含数字字母中文的名称等字段排序 例如:数字(0->9)->大写字母(A->Z)->小写字母(a->z)-> ...

  4. php 字母数字混合排序,JavaScript_基于JS实现数字+字母+中文的混合排序方法,在上篇文章给大家介绍了JavaScr - phpStudy...

    基于JS实现数字+字母+中文的混合排序方法 在上篇文章给大家介绍了JavaScript sort数组排序方法和自我实现排序方法小结,用自己的方法实现了数字数组的排序. 当然,实际运用中,我还是会使用s ...

  5. Word快速删除所有英文、数字或中文

    Word快速删除所有英文.数字或中文 亮术网 2014-08-08 本网原创 在编辑 Word 文档过程中,有的时候需要删除所有英文,有的时候又需要删除全部数字,有的时候要求替代所有中文(汉字):内容 ...

  6. 怎么将计算机桌面全部变成英文翻译,怎么在电脑桌面便签上将英文翻译为中文并混合保存为便签内容?具体步骤是什么...

    随着时代的发展,英语和我们的距离是越来越近.这不,在日常的工作和生活中,我们经常会接触到一些英文.而作为已经毕业多年的上班族,我们当年在学校学的那点儿英语知识早就已经还给老师了.所以,在遇到英文的时候 ...

  7. 正则表达式替换全部 中文汉字 英文 数字

    简单说明下用正则表达式替换全部中文汉字.英文.数字的方法 . 使用工具,Notepad2(或者支持正则表达式的都可以) 替换表达式: [a-zA-Z]+ [!^1-^127] 英文 数字 所有小写英文 ...

  8. Go 语言正则匹配 ID 逗号分隔 数字、英文字母、中文

    关键正则表达式: ok, _ := regexp.MatchString("^[A-Za-z\\d\u4e00-\u9fa5]+(,[A-Za-z\\d\u4e00-\u9fa5]+)*$& ...

  9. 数字的英文表达和中文表达

    //数字的英文表达和中文表达 public class NumEngAndChinese{//*************************中文表达************************ ...

最新文章

  1. el图片滚动_element的el-table中记录滚动条位置的示例代码
  2. 前端、git入门至常用指令
  3. java pom.xml 自定义变量
  4. pytoch word_language_model 代码阅读
  5. java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException
  6. html设置模块宽度为200像素,css 宽度(CSS width)
  7. VictoriaMetrics入门与实战
  8. 其他用户登陆到这台计算机,要登录到这台远程计算机,您必需拥有这台计算机上的‘终端服务器用户访问’权限解决方法...
  9. 李迟2022年1月知识总结
  10. 汇编语言(王爽)第四版检测点2.2答案
  11. 【NLP】浅谈 Transformer-based 模型中的位置表示
  12. SMCJ6.0CA TVS二极管应用领域(瞬态抑制二极管)
  13. 【分享】我在名牌大学毕业后的经历
  14. git 创建本地仓库,再关联远程创库
  15. QML 中如何动态创建组件
  16. Caffe新手教程傻瓜系列(9):训练和测试自己的图片
  17. 为什么可用性设计重要?如何实现可用性设计?
  18. java中public,private,protect,default区别
  19. ESB 企业服务总线基本内容概述
  20. [经验分享] 覃超线上直播课-模拟面试

热门文章

  1. X-Frame-Options 响应头
  2. CentOS7下搭建yum仓库
  3. System.ComponentModel.Component : MarshalByRefObject, IComponent, IDisposable
  4. 简单好用的sshfs -- 通过ssh映射远程路径(转)
  5. 前端开发小工具SuperApp——Ctrl+S自动刷新浏览器
  6. 每次Title显示不同的名言
  7. 什么是气泡图?怎样用Python绘制?有什么用?终于有人讲明白了
  8. 区块链入局,51小长假听歌、打游戏的姿势将被颠覆!
  9. 这个没去大厂的程序猿,用 4 年时间证明自己做对了!
  10. 从崩溃的选课系统,论为什么更安全的 HTTPS 协议没有被全面采用