按照整个执行过程来描述的,自己备注一下,呵呵
一、页面链接
引用
验证码:<input type="text" class="verify_input" id="validateCode" name="validateCode" maxlength="4">
<img id="vCode" src="validateImage.jpg" align="absmiddle" />
<a href="#" onclick="changeCode();">看不清,换一个</a>
二、在Web.xml中配置validateImg的映射路径
<servlet>
<servlet-name>validateImg</servlet-name>
<servlet-class>com.cytest.ValidateImg</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>validateImg</servlet-name>
<url-pattern>/validateImage.jpg</url-pattern>
</servlet-mapping>
三、ValidateImg.java的具体实现
package com.cytest;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.imageio.*;
public class ValidateImg extends HttpServlet {
//定义图形验证码中绘制字符的字体
private final Font mFont = new Font("Arial Black", Font.PLAIN, 16);
//定义图形验证码的大小
private final int IMG_WIDTH = 70;
private final int IMG_HEIGTH = 20;
/**
* 定义一个获取随机颜色的方法
*/
private Color getRandColor(int fc,int bc) {
Random random = new Random();
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);
}
/**
* 重写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");
BufferedImage image = new BufferedImage(IMG_WIDTH , IMG_HEIGTH , BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200 , 250));
//填充背景色
g.fillRect(1, 1, IMG_WIDTH - 1, IMG_HEIGTH - 1);
//为图形验证码绘制边框
g.setColor(new Color(102 , 102 , 102));
g.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGTH - 1);
g.setColor(getRandColor(160,200));
//生成随机干扰线
for (int i = 0 ; i < 80 ; i++) {
int x = random.nextInt(IMG_WIDTH - 1);
int y = random.nextInt(IMG_HEIGTH - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g.drawLine(x , y , x + xl , y + yl);
}
g.setColor(getRandColor(160,200));
//生成随机干扰线
for (int i = 0 ; i < 80 ; i++) {
int x = random.nextInt(IMG_WIDTH - 1);
int y = random.nextInt(IMG_HEIGTH - 1);
int xl = random.nextInt(12) + 1;
int yl = random.nextInt(6) + 1;
g.drawLine(x , y , x - xl , y - yl);
}
//设置绘制字符的字体
g.setFont(mFont);
//用于保存系统生成的随机字符串
String sRand = "";
for (int i = 0 ; i < 4 ; i++) {
String tmp = getRandomChar();
sRand += tmp;
//获取随机颜色
g.setColor(new Color(20 + random.nextInt(110)
,20 + random.nextInt(110)
,20 + random.nextInt(110)));
//在图片上绘制系统生成的随机字符
g.drawString(tmp , 15 * i + 10,15);
}
//获取HttpSesssion对象
HttpSession session = request.getSession(true);
//将随机字符串放入HttpSesssion对象中
session.setAttribute("randNum" , sRand);
g.dispose();
//向输出流中输出图片
ImageIO.write(image, "JPEG", response.getOutputStream());
}
/**
* 获取随机字符串
* @return
*/
private String getRandomChar() {
//生成一个0、1、2的随机数字
int rand = (int)Math.round(Math.random() * 2);
long itmp = 0;
char ctmp = '\u0000';
switch (rand) {
//生成大写字母
case 1:
itmp = Math.round(Math.random() * 25 + 65);
ctmp = (char)itmp;
return String.valueOf(ctmp);
//生成小写字母
case 2:
itmp = Math.round(Math.random() * 25 + 97);
ctmp = (char)itmp;
return String.valueOf(ctmp);
//生成数字
default :
itmp = Math.round(Math.random() * 9);
return itmp + "";
}
}
}
四、不小心误删Tomcat下的temp,出现了验证码图片无法加载的错误
原因:ImageIO.write(image, "JPEG", response.getOutputStream());此句需要写缓冲文件,该文件保存在temp下,当其不存在时,导致can't create output stream!
1.在Tomcat下手动创建一个temp
2.将ImageIO.write(image, "JPEG", response.getOutputStream());换成如下语句:
引用
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(image);
PS:以上是解决此问题的2种方式
分享到:
相关推荐
3. **抗干扰能力**:在复杂环境下,SiS9255能有效抵抗环境噪声和电磁干扰,确保触控功能的稳定运行。 4. **兼容性强**:芯片支持多种触控屏尺寸和分辨率,可以适应各种不同的显示设备,无论是小尺寸的手机屏幕还是...
\vBoy[2][1].v1.30.S60.SymbianOS.65k.Color_skyever汉化.sis\vBoy[2][1].v1.30.S60.SymbianOS.65k.Color_skyever汉化.sis\vBoy[2][1].v1.30.S60.SymbianOS.65k.Color_skyever汉化.sis\vBoy[2][1].v1.30.S60.Symbian...
用户在解压后,只需将解压出的文件复制到塞班一代(S60v1)或二代(S60v2)手机的内存卡特定文件夹,比如"Applications"或者"Games"目录下,然后通过手机的文件管理器找到并安装这些文件,就可以实现软件和游戏的...
诺基亚SIS程序 塞班S60 V1 V2 塞班S60 V3 V5 程序 刷机软件 摩托罗拉刷机软件 JAVA程序
4. JavaScript:虽然在“描述”中没有明确提及,但许多网站都会使用JavaScript来实现交互功能。初学者可以在此项目中寻找JavaScript代码,学习如何添加动态效果,如按钮点击事件、表单验证或Ajax异步数据加载。 5. ...
1. **安装和卸载**:工具可能提供了在电脑上模拟安装和卸载SIS文件的功能,这对于开发者调试应用或用户在未连接手机的情况下预览安装过程非常有用。 2. **文件打包**:它可能包含了一个将多个文件和资源打包成SIS...
2版糊资源分离器sis2版糊资源分离器sis2版糊资源分离器sis
`Sis 2 siSx & Jar Converter v1.0` 是一个工具,专门用于将 sis 文件转换为 sisx 文件格式,以便在较新的诺基亚手机或其他支持 sisx 的设备上运行。 转换过程可能涉及以下步骤: 1. **安装和运行转换工具**:首先...
这可能是一个用于在Windows环境下安装Sis文件的工具,它可能帮助用户在非Symbian设备上创建或管理sis文件。这个工具通常会模拟Symbian设备的环境,以便于开发者进行测试和打包应用。使用这样的工具,开发者可以更...
《SIS传染病模型在MATLAB中的实现与仿真》 传染病模型是理解疾病传播规律的重要工具,其中SIS(Susceptible-Infected-Susceptible)模型是一种经典的数学模型,用于描述在一个群体中易感者(Susceptible)与感染者...
(2)单击首页底部的“后台入口”按钮,输入用户名、密码及验证码进入后台管理界面。 (3)首页显示的信息都是在后台付费用发布的。 (4)在前台有一个“我要发布”链接按钮,免费发布供应信息。发布免费的信息需要...
在化工、石油炼制、天然气处理等行业中,SIS扮演着极其重要的角色,它能够在检测到可能引发危险的情况时自动采取措施,从而防止事故的发生或者减少事故的影响。 #### 霍尼韦尔SIS系统特点 霍尼韦尔作为全球领先的...
《sis 以太网网卡驱动在Windows系统下的开发详解》 在计算机硬件与操作系统交互的世界里,驱动程序扮演着至关重要的角色。本文将详细探讨如何使用C语言编写适用于Windows系统的sis以太网网卡驱动。SIS,即 Silicon ...
详细介绍了如何通过采用美国OSI软件公司的PI数据库接口,实现与机组原有控制系统的通信,以及在实施过程中需要注意的协议、分配方法和其他相关事项,为其他类似机组的SIS实施提供了参考。 文档首先指出了在已建发电...
2. **添加和删除文件**:如果需要在SIS包中添加额外的文件或者移除不必要的文件,SIS编辑器提供了这样的功能,使得定制安装包变得简单易行。 3. **修改元数据**:元数据包括应用程序的名称、版本信息、发布者等,...
4. "cpp" - 这个文件夹很可能包含了实现SIS文件解析功能的C++源代码文件,这些源文件实现了头文件中声明的函数和类,实际处理SIS文件的逻辑将在这里找到。 综合以上信息,这个压缩包对于想要在Symbian平台上开发C++...
这款驱动是MAC用户确保其SIS 191网卡在OS X系统下正常工作所必需的组件。 在描述中提到的“网卡驱动 FOR MAC OS 用HEXT 安装助手安装”,意味着安装这个驱动可能需要借助名为“HEXT”的安装工具或助手。HEXT可能是...
sis文件通常包含一个或多个资源文件、程序代码、证书以及安装信息,这些内容在安装过程中会被解压并复制到手机的相应目录下。 "SiS 管理1.45.sis" 和 "SiS 管理2.0.sis" 是两个不同的版本的SIS管理器应用。这些工具...
在传染病动力学建模中,SIR、SIS和SI模型是三种常用的基本模型,用于理解和预测传染病在人群中的传播规律。这些模型基于数学和计算机模拟,为公共卫生政策制定提供了理论依据。 首先,我们来看SI(易感者-感染者)...
该部分内容提到了SIS和ISIS技术的应用,通过模拟研究以及使用平滑剪切绝对偏差(Smoothly Clipped Absolute Deviation, SCAD)方法来进行变量的下选和估计效应。SCAD是一种惩罚函数,它可以促进变量系数的稀疏性,有...