做了个Java验证码程序,结果发现在Windows上运行一切正常,在Linux下却无法显示图片,在网上搜索,开始一直以为是tomcat\bin\catalina.sh的原因,但一直都不行,单独运行生成验证码的Servlet则抛出异常:
javax.imageio.IIOException: Can't create output stream!,
经查,在将图片输入到客户端时,不能使用ImageIO.write(image, "jpeg", response.getOutputStream());而应该使用如下方式:
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(image);
(一)生成验证码的servlet
package com.founder.chat.common;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 验证码输入校验类。
* @Project chat
* @Creator y.zhang
* @CreatDate 2009-4-11
*/
public class GetValidateImage extends HttpServlet
{
private static final long serialVersionUID = -8584041841501416165L;
private static int WIDTH = 60;
private static int HEIGHT = 20;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
HttpSession session = request.getSession();
// 设置浏览器不要缓存此图片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
// 创建内存图象并获得其图形上下文
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 产生随机的认证码并画图
char[] rands = this.generateCheckCode();
this.drawBackground(g);
this.drawRands(g, rands);
// 结束图像的绘制过程,完成图像
g.dispose();
// 将当前验证码存入到Session中
session.setAttribute("validateNum", new String(rands));
// 将图像输出到客户端
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(image);
}
/**
* 产生随机数。
* @return
*/
private char[] generateCheckCode()
{
// 定义验证码的字符表
String chars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
char[] rands = new char[4];
for (int i = 0; i < 4; i++)
{
int rand = (int) (Math.random() * 28);
rands[i] = chars.charAt(rand);
}
return rands;
}
/**
* 画随机数。
* @param g
* @param rands
*/
private void drawRands(Graphics g, char[] rands)
{
g.setColor(Color.BLACK);
g.setFont(new Font(null, Font.PLAIN | Font.BOLD, 18));
// 在不同的高度上输出验证码的每个字符
g.drawString("" + rands[0], 1, 17);
g.drawString("" + rands[1], 16, 15);
g.drawString("" + rands[2], 31, 18);
g.drawString("" + rands[3], 46, 16);
System.out.println(rands);
}
/**
* 画图片背景。
* @param g
*/
private void drawBackground(Graphics g)
{
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);
// 随机产生120个干扰点
for (int i = 0; i < 120; i++)
{
int x = (int) (Math.random() * WIDTH);
int y = (int) (Math.random() * HEIGHT);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, green, blue));
g.drawOval(x, y, 1, 0);
}
}
}
(二)web.xml文件配置该servlet
<servlet>
<servlet-name>GetValidateImage</servlet-name>
<servlet-class>com.founder.chat.common.GetValidateImage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetValidateImage</servlet-name>
<url-pattern>/GetValidateImage</url-pattern>
</servlet-mapping>
(三)页面加入表单和图片
<tr>
<td>请输入验证码(点击图片获取另一张):<br/>
<input type="text" name="imgCode" id="imgCohe"/>
<img src="../GetValidateImage" alt="点击图片获取另一张" onClick="javascript:this.src=this.src+'?'+Math.random()">
</td>
</tr>
(四)输入校验
主要有js的输入校验,还有利用Ajax进行java的匹配校验:
String strInputImgCode = request.getParameter("imgCode");
String strGenImgCode = (String) request.getSession().getAttribute("validateNum");
if (strInputImgCode.equalsIgnoreCase(strGenImgCode))
{…………}
分享到:
相关推荐
有没有发现最后生成了一串长的base64编码 把这一串编码放到img标签在前面加上"data:image/gif;base64,"是能直接使用的 ;base64,(你的base64编码)"/> ...验证码可以输入中文 前提是你的字体支持中文
Windows和Linux对字体的支持和渲染机制存在差异,这可能导致在Linux上显示的验证码文字形状、大小或清晰度与Windows上不一致。在这种情况下,提供特定的字体文件可以改善验证码的显示效果。 这里提到的四个ttf文件...
Java是一种广泛使用的跨平台编程语言,以其“一次编写,到处运行”的特性著称,因此这个抢票助手可以在多种操作系统上运行,如Windows、Mac OS或Linux。 该抢票助手主要利用了Java的Swing库来构建图形用户界面(GUI...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
2. **安装**:按照平台的指示进行安装,例如在Windows上运行安装程序,Linux环境下使用包管理器的安装命令。 3. **配置环境变量**:确保Tesseract的可执行文件路径添加到系统的PATH环境变量中,以便于在任何目录下...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...
安装视窗下载最新的独立zip: 在您当前的JD2文件夹中提取“ JDownloader 2.0”内容重新启动JD2并开始下载安装Linux和Mac 克隆此存储库下载并编译将生成的darknet可执行文件复制到/JDownloader 2.0/tools/...
### 基于JAVA的安全电子商务知识点详析 #### 一、电子商务系统概述 **1.1 电子商务的内涵与分类** - **认识电子商务** - 电子商务是指利用电子信息技术手段进行的各种商务活动,包括但不限于商品买卖、服务交易...
这里的"Fetion服务端(windows\linux)"表明该服务端实现了跨操作系统平台的支持,既能在Windows系统上运行,也能在Linux系统上运行,这通常需要采用跨平台的开发工具和语言,如Java或Python。 2. **PHP短信发送...