求几个图片验证码程序(数字或字母),要安全一点的,JSP 或 servlet上能运行的。
解决方案 »
- jbuilder 2006的JDK适合 tomcat 6.0吗
- hibernate mysql表类型为intoDB 数据插不进去?请问这是为什么?
- 如何知道jsp的版本号?
- 用window.open来下在一个txt文件,怎么每次都会把这个文件打开阿?我要的是弹出保存框。大家帮帮忙,我整了很久了没搞定。多谢。
- 如何配置tomcat可以限制用户的下载速度?
- 关于jsp传递页面参数的一个奇怪问题!!请高手指点迷津!!
- 为什么我在 创建PreparedStatement 对象时总是把Tomcat 搞死?????
- 一个表里有很多字段,估计几十个吧,我是多建几个表,还是一个表好啊,
- 关于一个bean调用另外一个bean的问题
- 请问,windows2000如何支持jsp??? - 如果你是JSP高手,希望你可以帮忙!
- jsp系统中,有个固定的时间字符串数组,每当打开网页的一个报表时都需要用到,怎么处理效率最高?
- According to TLD or attribute directive in tag file, attribute test does not accept any expressions
你看看这个能用的上吗? package test; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageGenerator extends HttpServlet {
/** *//**
*
*/
private static final long serialVersionUID = -3938318741402322164L; private static 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);
} private static String charsLong = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"; private static String charsShort = "0123456789"; private static String chars = charsLong; @Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
try {
int charsLength = chars.length(); response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); int width = 70, height = 20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height); g.setFont(new Font("Times New Roman", Font.ITALIC, height)); g.setColor(getRandColor(160, 200));
for (int i = 0; i < 35; 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);
} StringBuilder sRand = new StringBuilder();
String[] fontNames = { "Times New Roman", "Arial", "Book antiqua", "" }; for (int i = 0; i < 4; i++) {
g.setFont(new Font(fontNames[random.nextInt(3)], Font.ITALIC, height));
char rand = chars.charAt(random.nextInt(charsLength));
sRand.append(rand); g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(String.valueOf(rand), 16 * i + random.nextInt(6) + 3, height - random.nextInt(4));
} g.setColor(getRandColor(160, 200));
for (int i = 0; i < 30; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(width);
int yl = random.nextInt(width);
g.drawLine(x, y, x + xl, y + yl);
} request.getSession().setAttribute("Login_Image_Code", sRand.toString()); g.dispose(); try {
Thread.sleep(100);
} catch (Exception ex) {
}
OutputStream os = response.getOutputStream();
ImageIO.write(image, "JPEG", os);
os.flush();
os.close();
} catch (Exception ex) { }
}
} 修改 web.xml <servlet>
<servlet-name>imageGenerator</servlet-name>
<servlet-class>test.ImageGenerator</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>imageGenerator</servlet-name>
<url-pattern>/image.jsp</url-pattern>
</servlet-mapping>
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.com.business.CodeBean;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;public class CodeServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
//产生缓冲图象
BufferedImage bimg = new BufferedImage(60,30,BufferedImage.TYPE_INT_RGB);
//产生附加码
String code = "";
Random r = new Random();
for(int i = 0 ;i<4 ;i++){
code+=r.nextInt(10);
}
System.out.println(code);
request.setAttribute("code", code);
//得到缓冲图象的绘制环境
Graphics2D g = bimg.createGraphics();
//绘制图象
//清屏成白色
g.setColor(Color.white);
g.fillRect(0, 0, 100, 30);
//绘制附加码
g.setColor(Color.blue);
g.setFont(new Font("黑体",Font.BOLD, 20));
g.drawString(code, 10, 26);
for(int j =0 ;j<50;j++){
int k1 = r.nextInt(100);
int k2 = r.nextInt(100);
int k3 = r.nextInt(100);
int k4 = r.nextInt(100);
g.setColor(Color.white);
// g.drawLine(k1, k2, k3,k4);
g.drawOval(k1, k2, k3, k4);
}
//对缓冲进行编码转成jpeg
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
//输出
encoder.encode(bimg);
out.flush();
}
}
package com.banding.web.util;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;public class Image extends HttpServlet {
//public static final long serialVersionUID = 1L ;
//private static final String CONTENT_TYPE = "text/html; charset=GBK"; public 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);
} //Initialize global variables
public void init() throws ServletException {
} //Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
//设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); // 在内存中创建图象
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); // 获取图形上下文
Graphics g = image.getGraphics(); //生成随机类
Random random = new Random(); // 设定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height); //设定字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); //画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(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);
} // 取随机产生的认证码(4位数字)
String sRand = "";
for (int i = 0; i < 4; i++) {
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 将认证码显示到图象中
g.setColor(new Color(20 + random.nextInt(110),
20 + random.nextInt(110),
20 + random.nextInt(110)));
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
} // 将认证码存入SESSION
request.getSession().setAttribute("rand", sRand); // 图象生效
g.dispose(); // 输出图象到页面
//ImageIO.write(image, "JPEG", response.getOutputStream());
JPEGImageEncoder encode = JPEGCodec.createJPEGEncoder(response.
getOutputStream());
encode.encode(image); } //Clean up resources
public void destroy() {
}
} 上面的代码可以直接用,在web.xml中配置好以后就可以在浏览器中访问这个servlet,能得到下面的效果若要在jsp页面中使用这个验证码 只需用一个 <img src="那个servlet的地址" />这样就好了 这是我以前收藏的一个网摘
http://blog.csdn.net/JavaLover00000/archive/2009/03/26/4026211.aspx
很不错,你试试