java 验证码校验_JavaWeb验证码校验功能代码实例

后台生成验证码工具方法

/*

* 设置图片的背景色

*/

public static void setBackGround(Graphics g, int WIDTH, int HEIGHT) {

// 设置颜色

g.setColor(Color.WHITE);

// 填充区域

g.fillRect(0, 0, WIDTH, HEIGHT);

}

/*

* 设置图片的边框

*/

public static void setBorder(Graphics g, int WIDTH, int HEIGHT) {

// 设置边框颜色

g.setColor(Color.BLUE);

// 边框区域

g.drawRect(1, 1, WIDTH-2, HEIGHT-2);

}

/*

* 在图片上画干扰线

*/

public static void drawRandomLine(Graphics g, int WIDTH, int HEIGHT) {

// 设置颜色

g.setColor(Color.GREEN);

// 设置线条个数并画线

for(int i=0;i<5;i++) {

// 生成干扰线随机的起始坐标

int x1 = new Random().nextInt(WIDTH); // 生成0~WIDTH(不包括WIDTH)的随机数

int y1 = new Random().nextInt(HEIGHT);

// 生成干扰线随机的结束坐标

int x2 = new Random().nextInt(WIDTH);

int y2 = new Random().nextInt(HEIGHT);

g.drawLine(x1, y1, x2, y2);

}

}

/*

* 在图片上写随机数

*/

public static String drawRandomNum(Graphics2D g) {

// 设置颜色

g.setColor(Color.RED);

// 设置字体

g.setFont(new Font("宋体", Font.BOLD, 20));

// 常用的中国汉字(汉字区间:[\u4e00-\u9fa5])

String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";

StringBuffer sb = new StringBuffer();

int x = 5;

// 控制字数

for(int i=0;i<4;i++) {

int degree = new Random().nextInt()%30; //生成-30-30范围的随机数

String ch = base.charAt(new Random().nextInt(base.length()))+"";

sb.append(ch);

// 写入字之前,设置好旋转

g.rotate(degree*Math.PI/180, x, 20); // 设置字体旋转角度

g.drawString(ch, x, 20);

// 这次旋转不能影响下一次的旋转,所以要将上一次的旋转清掉,转回去

g.rotate(-degree*Math.PI/180, x, 20);

x+=30;

}

return sb.toString();

}

public static String generateUtilVerificationCode(Graphics g, int WIDTH, int HEIGHT, Boolean isBackground, Boolean isBorder, Boolean isLine) {

// 1.设置图片的背景色

if(notEmpty(isBackground) && isBackground){

setBackGround(g, WIDTH, HEIGHT);

}

// 2.设置图片的边框

if(notEmpty(isBorder) && isBorder){

setBorder(g, WIDTH, HEIGHT);

}

// 3.在图片上画干扰线

if(notEmpty(isLine) && isLine){

drawRandomLine(g, WIDTH, HEIGHT);

}

// 4.在图片上写随机数

String random = drawRandomNum((Graphics2D) g);

return random;

}

验证码生成后台

public static final int WIDTH = 120; // 生成的图片的宽度

public static final int HEIGHT = 35; // 生成的图片的高度

@RequestMapping(value="generateCode", method = {RequestMethod.GET,RequestMethod.POST})

public void generateCode(HttpServletRequest request, HttpServletResponse response) throws IOException{

// 在内存中创建一张图片

BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

// 得到图片

Graphics g = image.getGraphics();

String random = generateUtilVerificationCode(g, WIDTH, HEIGHT,true,true,true);

request.getSession().setAttribute("checkCode", random); // 将随机数存在session中

/*

* 5.图形写给浏览器

*/

response.setContentType("image/jpeg");

// 发响应头控制浏览器不要缓存图片

response.setDateHeader("expries", -1);

response.setHeader("Cache-Control", "no-cache");

response.setHeader("Pragma", "no-cache");

ImageIO.write(image, "jpg", response.getOutputStream());

}

前台代码实现

验证码:

generateCode

校验逻辑

从session中取出对比即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何做不浮躁的人

51CTO著名专家老刘&#xff0c;连发了两篇博文&#xff0c;老刘的博客http://2844337.blog.51cto.com/ 都是劝谏我们年轻人不要浮躁。两篇文章用故事教育我们一定不要浮躁&#xff0c;但是如何做到不浮躁&#xff0c;老刘没有说。我想借着这个主题&#xff0c;简单谈一下自己的…

hasset java_java HashSet的使用

今天在写代码时想要使用HashSet&#xff0c;由于之前并不了解&#xff0c;就在网上查了一下原理及使用方法。HashSet原理该类实现了Set接口&#xff0c;HashSet中不允许元素重复&#xff0c;不保证集合中元素的顺序&#xff0c;元素可为null&#xff0c;但最多只能一个。对于 H…

Oracle tips

存储过程无法编译和抛掉&#xff01;&#xff01;我在一个项目组中与同事一起开发存储过程&#xff0c;碰到过其他人在调试存储过程时&#xff0c;我无法编译同一个存储过程的问题。但是&#xff0c;现在我使用pl/sql dev将其他的进程都杀掉后&#xff0d;&#xff0d;包括在调…

TCP拥塞控制机制

为了防止网络的拥塞现象&#xff0c;TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成&#xff0c;后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

java中类似sort_java中的Sort函数,你值得看

基于C语言中的sort如此这么方便&#xff0c;自然而然&#xff0c;java中也有类似C的sort函数。1.普通数组&#xff1a;Arrays.sort(数组名&#xff0c;开始位置&#xff0c;结束位置)。2.类中属性排序&#xff1a;模板&#xff1a;class A{int n;}class cmp implement Comparat…

明天启程去北京:)

去北京参加为期5天的微软sps培训&#xff0c;公司穷呀&#xff0c;所以只能做火车去了&#xff0c;17日下午到达北京&#xff0c;18日&#xff0d;22日5天培训&#xff0c;23日到青岛&#xff0c;呆两三天然后26日下午回家&#xff1a;&#xff09;有北京和青岛的朋友可以联系我…

多线程java 银行_Java 多线程 之 银行ATM实例

package com.thread;import java.util.Scanner;public class TestBank {public static void main(String[] args) {Bank bank new Bank();Thread lingming new Thread(bank, "李明");Thread wangtao new Thread(bank, "王涛");lingming.start();try {Th…

CSDN登陆校验码模式识别程序

下班后&#xff0c;吃饭前快速写了这么一个东西&#xff0c;以证明图片验证码的脆弱。防君子&#xff0c;不防XX。本来应该使用HTTP协议直接从CSDN的登陆页面DOWN校验图片的&#xff0c;因为时间仓促&#xff0c;所以没有仔细设计。只是做一个示例&#xff0c;还要麻烦大家手工…

C语言中整形数组、字符数组、字符串的区别

一、 第一 整型数组的存放&#xff0c;数组最后是不加\0的&#xff0c;字符串会自动加上&#xff0c;因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的&#xff0c;字符串是一个一个字符存放的&#xff0c;每个字符占一个 二&#xff0c…

java hibernate 表关联_Hibernate多表关联

一、多对一进行关联(多个学生对应同一间宿舍)---学生是主体&#xff0c;宿舍是附体&#xff0c;关联关系在主体学生中设置&#xff0c;在学生类中设置宿舍类&#xff0c;由于宿舍类只有一个可以直接用类来设置,在映射学生类(User)中包含宿舍这个类(Room),在映射配置文件(User.h…

getchar、putchar、puts、gets

getchar(字符) 输入获取一个字符 putchar(字符) 输出控制台一个字符 scanf&#xff08;&#xff09;格式化输入 printf&#xff08;&#xff09; 格式化输出 gets(arr) 输入一个字符串给已经声明的数组arr puts(字符串或者字符数组名&#xff09;输出一个字符串 转载于:https…

关于异性朋友

听到别人在问一个问题&#xff1a;“可是你在大学里又有几个很要好的女性朋友&#xff1f;”   想到自己&#xff0c;却是一个没有。奇怪啊&#xff0c;我虽然木讷&#xff0c;但还不到白痴的地步&#xff0c;怎么会一个没有呢&#xff1f;思讨一下&#xff0c;明白了&#…

java全文检索工具_全文检索工具elasticsearch:第三章: Java程序中的应用

搭建模块创建二个项目gmall-list-service的appliction.properties:server.port8073spring.datasource.urljdbc:mysql://localhost:3306/gmall?characterEncodingUTF-8spring.datasource.usernamerootspring.datasource.passwordrootmybatis.configuration.map-underscore-to-c…

win10 多用户登陆

win10 多用户登陆 一般的直接下载就可以用了。 核心参考链接github 支持 1903 支持最新版本可以需要这个1903支持项参考页面 上述页面的下载文件页面1903支持页面 关于上述链接下载文件readme的解释 RDP Wrapper Library Updater --------------------------- <Add support …

DNN(DotNetNuke)注册用户终于突破10万人了,其3.0也终于跳票了...

是的&#xff0c;尽管我很不愿意&#xff0c;但的确是跳票了&#xff0c;或许跳票是软件开发的惯例了。据说会在圣诞节那天发布&#xff0c;也可能是月底&#xff0c;没有人知道&#xff1a;http://www.asp.net/Forums/ShowPost.aspx?tabindex1&PostID734458 不过&#xf…

java虚拟机MyEclipse_Eclipse和MyEclipse运行环境java虚拟机jvm设置,自己设置jre

Eclipse运行环境java虚拟机jvm设置&#xff0c;自己设置jre浅谈Eclipse寻找JVM(JRE)的顺序机制Eclipse也是一个普通的Java程序&#xff0c;因此必须有一个JRE做为运行环境。如果你的机器上没有安装任何JRE(或者JDK&#xff0c;本文不做二者的区分)&#xff0c;那么点击eclipse.…

初探机器学习之使用百度EasyDL定制化模型

一、Why 定制化模型 一般来说&#xff0c;各大云服务厂商只会提供一些最常见通用的AI服务&#xff0c;针对具体场景的AI应用则需要在云服务厂商提供的服务之上进行定制。例如&#xff0c;通常的图像识别只能做到分析照片的主题内容&#xff0c;而我的需求是给定指定场景的图片&…

Microsoft SQL Server Desktop Engine安装过程中遇到的问题(2)

今天下午没课&#xff0c;又在玩电脑了&#xff0c;想起昨天没解决的问题&#xff0c;心里有点不爽&#xff0c;遇到问题就要解决嘛^_^。 我把昨天装的study实例卸载了&#xff0c;仔细研究了一下自述文件&#xff0c;按照里面的说明&#xff0c;我在C盘根目录新建了一个名为 M…

java面向对象基础代码_JAVA基础知识点之Java面向对象

特点:1:将复杂的事情简单化。2:面向对象将以前的过程中的执行者&#xff0c;变成了指挥者。3:面向对象这种思想是符合现在人们思考习惯的一种思想。过程和对象在我们的程序中是如何体现的呢&#xff1f;过程其实就是函数&#xff1b;对象是将函数等一些内容进行了封装。匿名对象…

OCP-052考试题库汇总(4)-CUUG内部解答版

Which four statements are true about truncating a table? A)Any insert triggers for the table will be executed. B)Any of the table’s indexes are also truncated. C)Any delete triggers for the table will be executed. D)All table storage can be retained. E)O…