代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
选字验证码
作者:
嘉诚
/ 发布于
2017/11/13
/
981
本示例为选择一个字,点击图片上的字到后台进行验证
import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Random; /** * Created by Saindy on 2017/7/3. */ public class ImgCheckController extends BaseController { public void gotoDemo() { render("imgCheckDemo.jsp"); } private static Random random = new Random(); public void getImg() { // HttpServletRequest request = getRequest(); HttpServletResponse response = getResponse(); HttpSession session = getSession(); int fontSize = 30; int height = 490; //图片高 int width = 650; //图片宽 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D) image.getGraphics(); // 读取本地图片,做背景图片 String picPath = "d:/opt/img/" + (random.nextInt(4) + 1) + ".png"; System.out.println(picPath); try { g.drawImage(ImageIO.read(new File(picPath)), 0, fontSize, width, height, null); //将背景图片从高度30开始 } catch (IOException e) { e.printStackTrace(); } g.setColor(Color.WHITE); //设置颜色 g.drawRect(0, 0, width - 1, height - 1); //画边框 g.setFont(new Font("宋体", Font.BOLD, fontSize)); //设置字体 Integer x = null, y = null; //用于记录坐标 String target = null; // 用于记录文字 for (int i = 0; i < 4; i++) { //随机产生4个文字,坐标,颜色都不同 g.setColor(getRandColor(100, 160)); String str = getRandomChineseChar(); int a = random.nextInt(width - 100) + 50; int b = random.nextInt(height - 100) + 55; if (x == null) { x = a; //记录第一个x坐标 } if (y == null) { y = b;//记录第一个y坐标 } if (target == null) { target = str; //记录第一个文字 } AffineTransform affine = new AffineTransform(); System.out.println("第:" + i + "个"); g.drawString(str, a, b); System.out.println("生成的文字[" + str + "], 坐标:x=" + a + ", y=" + b); } g.setColor(Color.white); g.drawString("请点击" + target, 0, fontSize);//写入验证码第一行文字 “请点击..” session.setAttribute("gap", x + ":" + y);//将坐标放入session //5.释放资源 g.dispose(); //6.利用ImageIO进行输出 try { response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); ImageIO.write(image, "PNG", response.getOutputStream()); //将图片输出 } catch (IOException e) { e.printStackTrace(); } } /** * 随机产生颜色 */ private static Color getRandColor(int fc, int bc) { if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } /** * 随机产生汉字 */ public String getRandomChineseChar() { String str = null; int heightPos, lowPos; // 定义高低位 Random random = new Random(); heightPos = (176 + Math.abs(random.nextInt(39))); //获取高位值 lowPos = (161 + Math.abs(random.nextInt(93))); //获取低位值 byte[] b = new byte[2]; b[0] = (new Integer(heightPos).byteValue()); b[1] = (new Integer(lowPos).byteValue()); try { str = new String(b, "GBk"); //转成中文 } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); } return str; } public void checkImg() { HttpSession session = getSession(); String mX = getPara("x"); String mY = getPara("y"); String str = (String) session.getAttribute("gap");//获取session中的gap String[] split2 = str.split(":"); int x = Integer.parseInt(mX); int y = Integer.parseInt(mY); int x1 = Integer.parseInt(split2[0]); int y1 = Integer.parseInt(split2[1]); if (x1 - 22 < x && x < x1 + 22 && y1 - 22 < y && y < y1 + 22) { //若前端上传的坐标在session中记录的坐标的一定范围内则验证成功 renderJson(HttpResultEntry.ok("验证成功")); } else { renderJson(HttpResultEntry.error(100, "验证失败")); } } public void checkSliding() { String mX = getPara("x"); int x = Integer.parseInt(mX); if (x == 261) { renderJson(HttpResultEntry.ok("验证成功")); } else { renderJson(HttpResultEntry.error(100, "验证失败")); } } }
试试其它关键字
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
嘉诚
贡献的其它代码
(
24
)
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
springboot应用部署shell脚本
.
利用ffmpeg将MP4文件切成ts和m3u8
.
判断字符串是否json格式
.
数组去重,记录数组元素角标
.
选字验证码
.
easyui-防止表单重复提交
.
单源最短路径算法Dijkstra算法
.
在Angular.js中的H5页面调用Web api时跨域问题处理
.
获取当前week、month、quarter的第一天/最后一天
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3