做过验证码的朋友进来谈谈!

ailishow 2005-12-27 11:55:46
请问生成验证码有那几种方法?俺想做个,但不知从何下手!
...全文
259 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fog628 2005-12-28
  • 打赏
  • 举报
回复
<%@ page contentType="image/jpeg" import="java.awt.*,
java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
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);
}
%>
<%
//设置页面不缓存
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
session.setAttribute("rand",sRand);

// 图象生效
g.dispose();

// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
zydgyy 2005-12-28
  • 打赏
  • 举报
回复
楼上有人产生每个随机编码,是每次调用Math.random函数.
我觉得这个有点效率低下,不如一次性产生一个字节数组,用Random的方法,然后利用移位来产生响应的字母数字等.session的ID号是这样产生的.
patternslu 2005-12-28
  • 打赏
  • 举报
回复
servlet
smilefei 2005-12-28
  • 打赏
  • 举报
回复
厉害
剑事 2005-12-28
  • 打赏
  • 举报
回复
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.*;
import com.util.PwdCreat;

public class ImageVerify extends HttpServlet
{
private static final String CONTENT_TYPE = "image/jpeg;charset=GB2312";
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
int width = 40;
int height = 16;
int x = 0;
int y = 16;
String text = PwdCreat.getPwd(4);
request.getSession().setAttribute("imgcode",text);
BufferedImage image = new BufferedImage(width, height, 1);
Graphics g = image.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, width, height);
Font mFont = new Font("黑体", 1, 14);
g.setFont(mFont);
g.setColor(new Color(255, 0, 0));
g.drawString(text, x+3, y-3);
response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();

}
}
zairwolfo 2005-12-28
  • 打赏
  • 举报
回复
还是php简单。jsp要这么麻烦啊。
ailishow 2005-12-28
  • 打赏
  • 举报
回复
多谢大虾!
funcreal 2005-12-27
  • 打赏
  • 举报
回复
<img src="servlet的名字" width="40" height="20" alt=""/>
funcreal 2005-12-27
  • 打赏
  • 举报
回复
package businesshall;

import java.awt.*;
import java.awt.image.*;
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.sun.image.codec.jpeg.*;


public class ValidateCode extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";


//Initialize global variables
public void init() throws ServletException {
}


//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletOutputStream out = response.getOutputStream();

/*
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
*/
//---------------------------生成验证码----------------------------------
String code1 = String.valueOf((int) (java.lang.Math.random() * 10));
String code2 = String.valueOf((int) (java.lang.Math.random() * 10));
String code3 = String.valueOf((int) (java.lang.Math.random() * 10));
String code4 = String.valueOf((int) (java.lang.Math.random() * 10));
String validateCode = code1 + code2 + code3 + code4;
HttpSession session = request.getSession();
session.setAttribute("validateCode", validateCode);

//--------------------------绘制图形-------------------------------------
BufferedImage bimg = new BufferedImage(40, 20, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bimg.createGraphics();
g2d.setColor(new Color(198, 207, 212));
g2d.fillRect(0, 0, 40, 20);
g2d.setColor(new Color(102, 102, 0));
g2d.setFont(new Font("Dialog", Font.BOLD, 14));
g2d.drawString(validateCode, 1, 15);
g2d.dispose();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(bimg);
out.flush();
}


//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}


//Clean up resources
public void destroy() {
}
}
GlobalFree 2005-12-27
  • 打赏
  • 举报
回复
CONTENT_TYPE = "text/html; charset=GBK";
应该图片的类型 ,如"Content-type: image/PNG"
然后用java的Graphic生成图片
用session保存随机数。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧