- 浏览: 654446 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
nehaoww:
754588141@qq.com,源码可以给一份吗
Struts/JSP可上传、预览服务器端文件(图片、文件、Flash、多媒体)文件组件 -
zzd_md:
把XmlTreeLoader.js 这个文件的路径改一下就好了 ...
ExtJs 实现的后台管理框架 -
llixinrui_strive:
EXT之form.load(转) -
liangzhang0929:
部门管理和用户管理的url怎么显示#,没法打开dept_lis ...
Extjs3.x Struts2 -Json-plugin学习实例 -首页框架代码 05 -
datouren:
您好想问你一下 为什么只显示根节点 其它节点不显示 目前是在一 ...
ExtJs加载本地txt格式的数据
验证码代码取之网络,但是网络上代码都不完整,因此修改后发上来大家分享。
先看看效果:
一、生成图形验证码的Action
package com.wjt276.co.web.actions; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import com.wjt276.co.managers.ValidateImageManager; @SuppressWarnings("serial") public class ValidateImgAction extends BaseAction { /** * 用于保存已经生成的图形验证码输入流对象,以便在前台显示图形 */ private ByteArrayInputStream inputStream; /** * 图形验证码创建接口 */ private ValidateImageManager validateImageManager; /** * 图形验证码图形的宽度 */ private int width; /** * 图形验证码图形的高度 */ private int height; /** * 图形验证码图形上字体大小 */ private int fontSize; /** * 生成验证码的位数 */ private int codeLength; /** * 图形验证码的图形类型 */ private String contentType; public String execute() throws Exception{ //保存已经生成好的验证码 Key.validateCode = createInputStream(ValidateImageManager.Disturb_Type_Complex); return SUCCESS; } /** * 在Action层创建图形验证码,并将创建好的图形字节流保存到inputStream对象中,并返回验证码 * @param disturbType 绘制干扰线的类型;<br/> * 0:不绘制干扰线;<br/> * 1:绘制单一色调的干扰线;<br/> * 2:绘制复杂的干扰线 * @return 返回已经生成好的验证码字符 * @throws IOException */ protected String createInputStream(int disturbType) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); String validateCode = null; validateCode = validateImageManager.createValidateCode(disturbType, this.getFontSize(), bos, this.getWidth(), this.getHeight(), getText("System.validateCode",ValidateImageManager.Default_ValidateCode), this.getCodeLength()); inputStream = new ByteArrayInputStream(bos.toByteArray()); bos.close(); return validateCode; } //------------以下为getXXX/setXXX方法------------------------- public ByteArrayInputStream getInputStream() { return inputStream; } public void setInputStream(ByteArrayInputStream inputStream) { this.inputStream = inputStream; } public ValidateImageManager getValidateImageManager() { return validateImageManager; } public void setValidateImageManager(ValidateImageManager validateImageManager) { this.validateImageManager = validateImageManager; } public String getContentType() { if(null == this.contentType || "".equals(this.contentType.trim())){ return Key.DEFAULT_VALIDATEIMG_CONTENT_TYPE; } return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } public int getWidth() { if(this.width < Key.DEFAULT_VALIDATEIMG_WIDTH){ return Key.DEFAULT_VALIDATEIMG_WIDTH; } return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { if(this.height < Key.DEFAULT_VALIDATEIMG_HEIGHT){ return Key.DEFAULT_VALIDATEIMG_HEIGHT; } return height; } public void setHeight(int height) { this.height = height; } public int getFontSize() { if(this.fontSize < Key.DEFAULT_VALIDATEIMG_FONT_SIZE){ return Key.DEFAULT_VALIDATEIMG_FONT_SIZE; } return fontSize; } public void setFontSize(int fontSize) { this.fontSize = fontSize; } public int getCodeLength() { if(this.codeLength < Key.DEFAULT_VALIDATEIMG_CODE_LENGTH){ return Key.DEFAULT_VALIDATEIMG_CODE_LENGTH; } return codeLength; } public void setCodeLength(int codeLength) { this.codeLength = codeLength; } }
二、生成图形验证码的接口ValidateImageManager
package com.wjt276.co.managers;
import java.io.ByteArrayOutputStream;
public interface ValidateImageManager {
/**
* 默认验证字符串
*/
public static final String Default_ValidateCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
/**
* 默认绘制干扰线的类型(不绘制干扰线)
*/
public static final int Disturb_Type_Default = 0;
/**
* 绘制单一色调的干扰线
*/
public static final int Disturb_Type_Simple = 1;
/**
* 绘制复杂的干扰线
*/
public static final int Disturb_Type_Complex = 2;
/**
* 生成验证图片并返回验证码
*
* @param disturbType 绘制干扰线的类型;<br/>
* 0:不绘制干扰线;<br/>
* 1:绘制单一色调的干扰线;<br/>
* 2:绘制复杂的干扰线
* @param fontSize 图形上验证码字体的大小
* @param bos 字节流,用于返回生成的图形验证码字节流,并显示于前台
* @param width 图形的宽度
* @param height 图形的高度
* @param validateCode 默认的验证码编码
* @param codeLength 验证码字符长度
* @return 返回生成好的验证码字符
*/
public abstract String createValidateCode(int disturbType, int fontSize,
ByteArrayOutputStream bos, int width, int height,
String validateCode, int codeLength);
}
一、生成图形验证码的实现ValidateImageManagerImpl
package com.wjt276.co.managers.impl;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import com.wjt276.co.managers.ValidateImageManager;
public class ValidateImageManagerImpl extends AbstractManager implements
ValidateImageManager {
/**
* 生成验证图片并返回验证码
*
* @param disturbType 绘制干扰线的类型;<br/>
* 0:不绘制干扰线;<br/>1:绘制单一色调的干扰线;<br/>2:绘制复杂的干扰线
* @param fontSize 图形上验证码字体的大小
* @param bos 字节流,用于返回生成的图形验证码字节流,并显示于前台
* @param width 图形的宽度
* @param height 图形的高度
* @param validateCode 默认的验证码编码
* @param codeLength 验证码字符长度
* @return 返回生成好的验证码字符
*/
public String createValidateCode(int disturbType,
int fontSize,
ByteArrayOutputStream bos,
int width,
int height,
String validateCode,
int codeLength) {
BufferedImage bImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = bImg.getGraphics();
Random random = new Random();
if (null == validateCode || validateCode.isEmpty()) {
validateCode = Default_ValidateCode;
}
if (fontSize >= height) {
fontSize = height - 1;
}
drawOutline(g, width, height);
switch (disturbType) {
case Disturb_Type_Simple:
drawSimpleDisturb(g, random, width, height);
break;
case Disturb_Type_Complex:
drawDisturb(g, random, width, height);
break;
default:
break;
}
String code = drawCode(g, random, validateCode, codeLength, width,
height, fontSize);
g.dispose();
try {
ImageOutputStream imOut = ImageIO.createImageOutputStream(bos);
ImageIO.write(bImg, "JPEG", imOut);
imOut.close();
} catch (IOException e) {
e.printStackTrace();
}
return code;
}
/**
* 绘制边框
*
* @param g
* @param width
* @param height
*/
private static void drawOutline(Graphics g, int width, int height) {
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
}
/**
* 绘制比较复杂的干扰线
*
* @param g
* @param random
* @param width
* @param height
*/
private static void drawDisturb(Graphics g, Random random, int width,
int height) {
int x, y, x1, y1;
for (int i = 0; i < width; i++) {
x = random.nextInt(width);
y = random.nextInt(height);
x1 = random.nextInt(12);
y1 = random.nextInt(12);
g.setColor(getRandomColor(random, 120, 255));
g.drawLine(x, y, x + x1, y + y1);
g.fillArc(x, y, x1, y1, random.nextInt(360), random.nextInt(360));
}
}
/**
* 绘制简单的干扰线
*
* @param g
* @param random
* @param width
* @param height
*/
private static void drawSimpleDisturb(Graphics g, Random random, int width,
int height) {
g.setColor(getRandomColor(random, 160, 200));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
}
/**
* 取得随机颜色
*
* @param random
* @param pMin
* @param pMax
* @return
*/
private static Color getRandomColor(Random random, int pMin, int pMax) {
pMax = (Math.abs(pMax) > 255 ? 255 : Math.abs(pMax));
pMin = (Math.abs(pMin) > 255 ? 255 : Math.abs(pMin));
int r = pMin + random.nextInt(Math.abs(pMax - pMin));
int g = pMin + random.nextInt(Math.abs(pMax - pMin));
int b = pMin + random.nextInt(Math.abs(pMax - pMin));
return new Color(r, g, b);
}
/**
* 绘制验证码
*
* @param g
* @param random
* @param validateCode
* @param codeLength
* @param width
* @param height
* @param fontSize
* @return
*/
private static String drawCode(Graphics g, Random random,
String validateCode, int codeLength, int width, int height,
int fontSize) {
int validateCodeLength = validateCode.length();
Font font1 = new Font("Verdana", Font.BOLD, fontSize);
Font font2 = new Font("serif", Font.BOLD, fontSize);
StringBuffer sb = new StringBuffer();
int x, y;
for (int i = 0; i < codeLength; i++) {
x = (width / codeLength - 1) * i
+ random.nextInt(width / (codeLength * 2));
y = random.nextInt(height - fontSize) + fontSize;
sb.append(getRandomChar(validateCode, validateCodeLength, random));
g.setColor(getRandomColor(random, 70, 150));
if (sb.substring(i).getBytes().length > 1)
g.setFont(font2);
else
g.setFont(font1);
g.drawString(sb.substring(i), x, y);
}
return sb.toString();
}
/**
* 取得随机字符
*
* @param validateCode
* @param validateCodeLength
* @param random
* @return
*/
private static char getRandomChar(String validateCode,
int validateCodeLength, Random random) {
return validateCode.charAt(random.nextInt(validateCodeLength));
}
}
发表评论
-
java中switch case用法
2010-11-08 11:40 3894关于java中switch使用的一些说明 switc ... -
计算两个日期之间的天数
2010-08-10 16:14 1960//计算两个日期之间的天数 public static ... -
Struts2 生成图形验证码及进行验证码验证-修改后代码(二)
2010-07-28 09:48 2690三、BaseAction代码 package com. ... -
Java位操作
2010-06-12 10:39 1125二进制负数以它正值的补码形式表达 补码:反码+1等于补码 ... -
Thread.Sleep(0)
2010-04-13 14:03 4299Thread.Sleep(0) 表示挂起0毫秒,你可能觉得没作 ... -
System.currentTimeMillis()
2010-04-13 14:00 6171首先System.currentTimeMillis()产生一 ... -
Random
2010-04-13 13:58 1667一、Random 1、创建Random ... -
排序口诀
2010-04-13 11:47 1351马老师的口诀: 冒择路(入)兮(希尔)快归堆 冒泡 选择 ... -
将JAVA编译为EXE的几种方法
2009-12-23 12:26 1097将Java应用程序本地编译为EXE的几种方法(建议使用JOVE ... -
一个Java程序员应该掌握的10项技能
2009-11-01 12:10 10901、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报 ... -
Jdbc连接各种数据库代码方法大全
2009-11-01 12:08 12761、Oracle8/8i/9i数据库(thin模式) Cla ... -
Java四舍五入保留两位小数
2009-11-01 12:05 10135public static void main(String[ ... -
Java 将字符串转换为日期
2009-08-24 07:04 1781try { String strForm ... -
for each循环
2009-08-24 06:58 1708for each循环 是jdk5.0新增加的一个循环结构, ... -
java 根据IP获取客户端Mac地址
2009-08-18 22:48 6951需要对用户的 ip 和 mac 地址进行验证,这里用到获取客户 ...
相关推荐
"HFSS软件包下的圆锥(圆形)喇叭天线模型制作与参数调整:自主创造,实验验证,全流程教程指导",HFSS圆锥(圆形)喇叭天线 天线模型,自己做的,附带结果,可改参数,HFSS软件包 (有教程,具体到每一步,可以自己做出来) ,HFSS; 圆锥(圆形)喇叭天线; 模型自制; 参数可改; HFSS软件包; 教程详尽。,HFSS圆锥喇叭天线模型:可自定义参数与结果
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"基于S7-200 PLC与组态王技术构建的智能化新能源汽车电池检测系统上位机软件平台",基于S7-200plc与组态王组态的新能源汽车电池检测系统上位机 ,S7-200plc;组态王组态;新能源汽车电池检测系统;上位机,"基于PLC与组态王的汽车电池检测上位机系统"
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
nodejs010-nodejs-docs-0.10.5-8.el6.centos.alt.x86_64.rpm
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
“基于Cadence Orcad的全面元器件数据库管理系统——全配版与基础版对比分析”,搭建使用Cadence Orcad CIS元器件数据库(默认为Access数据库,如需MySQL数据库需提前沟通),含orcad符号库,Allegro PCB库 —————————————————— 该元器件数据库种类丰富,大分类就有28种(全配版,含有很多如海思,全志,瑞芯微,TI,Xilinx等主流复杂IC的库信息),20种(基础版)。 ———————————————————— 全配版包含1000多种元器件属性信息汇总,都是已验证使用过的,可直接用于自己的电路设计。 全配版还附有大部分与元器件PCB封装已匹配好的的3D模型。 强烈建议原理图库及封装库基于数据库的方式来管理,好处主要有以下几点: 1. 易于管理,可通过数据库文件批量添加、更改或删除器件参数; 2. 减少原理图库的种类, 同类器件只需要新建一次原理图库, 例如不同阻值、精度的电阻; 3. 器件具有唯一性, 每个器件的参数都是唯一的; 4. 方便使用, 如使用 Link Database Part 功能,可以快速完成器件批量替,
1、文件内容:ptlib-devel-2.10.10-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ptlib-devel-2.10.10-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
西门子S7-1200+5轴伺服驱动系统的走工艺对象技术解析——采用脉冲输出驱动方式的控制方法及在全博途V15.1程序中的应用研究。,S7-1200+5轴伺服 走工艺对象 脉冲输出驱动方式 适用于西门子s7-1200+第三方伺服驱动器 全套博途v15.1程序 ,S7-1200;5轴伺服;走工艺对象;脉冲输出驱动方式;第三方伺服驱动器;博途v15.1程序,西门子S7-1200 5轴伺服系统控制程序
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
《四层三列堆垛式立体库控制系统:带解释的梯形图接线原理图及IO分配与组态画面详解》,4x3堆垛式立体库4层3列四层三列书架式立体库控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,立体库; 堆垛式; 控制系统; 梯形图; 接线图; 原理图; IO分配; 组态画面,"立体库控制系统原理图:四层三列堆垛式书架的IO分配与组态画面"
1、文件内容:pyOpenSSL-0.13.1-4.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pyOpenSSL-0.13.1-4.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
基于三菱PLC与MCGS技术的防盗门报警系统:梯形图接线图原理及IO分配、组态画面详解,基于三菱PLC和MCGS的防盗门报警器 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,三菱PLC; MCGS; 防盗门报警器; 梯形图接线图; IO分配; 组态画面,基于三菱PLC与MCGS的报警器系统:梯形图接线与组态画面详解
"COMSOL金膜表面等离子共振(SPR)分析:不同入射角下的共振角度观察",comsol金膜表面等离子共振SPR,不同入射角查看共振角度 ,关键词:comsol金膜表面;等离子共振(SPR);不同入射角;共振角度;分离度;角度调节;材料表面光;生物传感;互动现象;实时分析,"COMSOL研究金膜表面等离子共振: 角度变化影响共振角度"
1. 机器学习与深度学习 机器学习是人工智能的核心领域,旨在通过数据训练模型,使计算机能够从经验中学习和改进。监督学习、无监督学习和强化学习是其主要分支,广泛应用于图像识别、语音处理和预测分析等场景。深度学习作为机器学习的重要子领域,通过神经网络模拟人脑的工作机制,尤其在图像分类、自然语言处理和自动驾驶等领域取得了突破性进展。深度学习模型如卷积神经网络(CNN)和循环神经网络(RNN)已成为许多AI应用的基础。 2. 自然语言处理与计算机视觉 自然语言处理(NLP)使计算机能够理解、生成和处理人类语言,关键技术包括机器翻译、语音识别、情感分析和问答系统。例如,智能助手(如Siri、Alexa)和聊天机器人(如ChatGPT)都依赖于NLP技术。计算机视觉则让计算机能够“看懂”图像和视频,广泛应用于人脸识别、自动驾驶、医疗影像分析等领域。目标检测、图像分割和视频分析等技术正在推动安防、零售和制造业的智能化转型。 3. 强化学习与AI伦理 强化学习通过试错和奖励机制,训练智能体在复杂环境中做出最优决策,广泛应用于游戏AI(如AlphaGo)、机器人控制和资源调度等领域。与此同时,随着AI技术的快速发展,AI伦理和社会影响也成为重要研究方向。如何确保AI的公平性、透明性和隐私保护,以及应对AI对就业和社会结构的潜在影响,已成为学术界和产业界共同关注的焦点。AI的可持续发展离不开技术与伦理的平衡。
不同放牧策略对草原土壤性质的影响研究——基于机器学习.pdf
本资源提供一种基于Proteus仿真的纯硬件NE555呼吸灯设计方案,结合NE555定时器、三极管(如2N2222或8050)、电阻、电容等元件,完整实现LED的呼吸灯效果。内容包括: Proteus仿真模型搭建:电路原理图设计、虚拟示波器波形分析; 硬件实现步骤:元件选型、焊接调试、实测波形对比; 参数调优方法:通过仿真快速调整RC参数控制呼吸频率与渐变平滑度。 目标: 掌握Proteus中NE555电路仿真技巧; 理解硬件电路与仿真模型的匹配性; 学习从虚拟仿真到实物落地的全流程设计; 培养故障排查与参数优化能力。 核心功能: 仿真验证:在Proteus中模拟NE555的PWM输出及LED亮度渐变效果; 硬件实现:通过三极管驱动电路将仿真结果转化为实物呼吸灯; 双向调试:支持仿真与硬件实测数据对比,快速定位设计问题。 关键模块: NE555无稳态多谐振荡器(控制占空比渐变); Proteus虚拟示波器(观测PWM波形变化); 三极管电流放大电路(驱动高亮度LED)。 设计亮点 虚实结合:通过Proteus仿真降低硬件试错成本,提升学习效率。
,全c源程序太阳能并网逆变器全C源程序单相3kw5kw,板图原理图清单,可以直接打板验证,超好的生产光伏逆变器的技术方案,量产方案
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx