`
octopusyu
  • 浏览: 23973 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java输入验证码在linux上不能显示的问题

阅读更多

做了个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))
{…………}

 

分享到:
评论

相关推荐

    java生成图形验证码 带详细注释 拷贝即用 兼容linux系统 含字体

    有没有发现最后生成了一串长的base64编码 把这一串编码放到img标签在前面加上"data:image/gif;base64,"是能直接使用的 ;base64,(你的base64编码)"/&gt; ...验证码可以输入中文 前提是你的字体支持中文

    解决验证码问题的4个ttf文件.rar

    Windows和Linux对字体的支持和渲染机制存在差异,这可能导致在Linux上显示的验证码文字形状、大小或清晰度与Windows上不一致。在这种情况下,提供特定的字体文件可以改善验证码的显示效果。 这里提到的四个ttf文件...

    12306 抢票助手 - Java版

    Java是一种广泛使用的跨平台编程语言,以其“一次编写,到处运行”的特性著称,因此这个抢票助手可以在多种操作系统上运行,如Windows、Mac OS或Linux。 该抢票助手主要利用了Java的Swing库来构建图形用户界面(GUI...

    java开源包6

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包9

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包4

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包101

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包5

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包8

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包10

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包3

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包1

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    Java资源包01

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    【图片验证码提取工具】tesseract-ocr下载

    2. **安装**:按照平台的指示进行安装,例如在Windows上运行安装程序,Linux环境下使用包管理器的安装命令。 3. **配置环境变量**:确保Tesseract的可执行文件路径添加到系统的PATH环境变量中,以便于在任何目录下...

    java开源包2

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包11

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    java开源包7

    利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth ...

    CaptchaSolver:JDownload 2离线验证码求解器

    安装视窗下载最新的独立zip: 在您当前的JD2文件夹中提取“ JDownloader 2.0”内容重新启动JD2并开始下载安装Linux和Mac 克隆此存储库下载并编译将生成的darknet可执行文件复制到/JDownloader 2.0/tools/...

    基于JAVA的安全电子商务(毕设论文).doc

    ### 基于JAVA的安全电子商务知识点详析 #### 一、电子商务系统概述 **1.1 电子商务的内涵与分类** - **认识电子商务** - 电子商务是指利用电子信息技术手段进行的各种商务活动,包括但不限于商品买卖、服务交易...

    fetion服务端(windows\linux)、PHP短信发送模块

    这里的"Fetion服务端(windows\linux)"表明该服务端实现了跨操作系统平台的支持,既能在Windows系统上运行,也能在Linux系统上运行,这通常需要采用跨平台的开发工具和语言,如Java或Python。 2. **PHP短信发送...

Global site tag (gtag.js) - Google Analytics