注册时,java代码如何实现验证码。(
很多网站都有。图片在边上 --------------------编程问答-------------------- 连接数据库,从数据库中读取相应的验证码,一张图一个验证码,然后跟输入匹配 --------------------编程问答-------------------- 这需要和数据库相连吗?? --------------------编程问答-------------------- public void doPost(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");
int w = 100,h = 20;
BufferedImage b = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics g = b.getGraphics();
g.setColor(new Color(255,255,255));
g.fillRect(0, 0, w, h);
//画干扰线,让图片看起来很乱
Random r = new Random();
for(int i = 0;i<300;i++){
int x = r.nextInt(w);
int y = r.nextInt(h);
int x2 = r.nextInt(w);
int y2 = r.nextInt(h);
g.setColor(this.getColor());
g.drawLine(x, y, x2, y2);
}
g.setColor(Color.red);
g.setFont(new Font("Arial",Font.BOLD,14));
String rand = this.getRandomStr();//得到产生的随机字符串
request.getSession().setAttribute("rand", rand);//把它放入session中
for(int i = 0;i<rand.length();i++){//在页面上把其画出来
g.drawString(rand.charAt(i)+"", 10+15*i, 15);
}
ImageIO.write(b, "jpeg", response.getOutputStream());
}
这是一个servlet的写法。你参考一下。 --------------------编程问答-------------------- 写个过滤器? --------------------编程问答--------------------
--------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- 5楼的程序你可以试试。 --------------------编程问答--------------------
<%--
Document : image
Created on : 2010-3-8, 15:32:40
Author : Administrator
--%>
<%@ page contentType="image/jpeg" import="java.util.*,java.awt.*,java.io.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<%!
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("randCode",sRand);
// 图象生效
g.dispose();
OutputStream output=response.getOutputStream();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
output.flush();
out.clear();
out = pageContext.pushBody();
%>
</body>
</html>
这个是验证码的JSP文件,可以随机生成验证码并绘图,把它放到相应的位置的img标签里就OK了
它把验证码放在session,用randCode标识
请问如何获取到图片里的验证码?
想验证输入的验证码是否正确时,不知道怎么取图里的验证码了… --------------------编程问答--------------------
--------------------编程问答-------------------- 为什么放着jCaptcha和patchca这么好的东西不用,非得自己写验证码哪? --------------------编程问答-------------------- 5楼,直接在网页里的写法可行吗?? --------------------编程问答-------------------- liuyuhua0066说的对,除非你想开发一个框架,否则为嘛现成的不用?
<tr>
<td width="50%" align="right">验证码</td>
<td width="50%"align="left"><inputname="checkCode"type="text"size="3" /><imgsrc="CheckCodeServlet">
</td>
</tr>
<--!CheckCodeServlet 是你写验证码的servlset的 url-pattern-->
难道你认为你开发的东西bug会比人家少?当然你若是为了学习那是另外一回事 --------------------编程问答--------------------
java代码内嵌jsp页面当然可行 --------------------编程问答-------------------- 1楼的说连数据库,纯属瞎扯。没人这样做。
基本思路就是
在Servlet中进行:
建立一个字符数组并赋值,指定将要在图片中出现的字符。当然也可以从字库中选取,不过笔画多的字可能会看不清。
构建一个 BufferedImage 图片缓存对象,通这图片缓存对象得到 JAVA2D 中的 Graphics 绘图对象
选取 要输出的字符,随机字体,字号,颜色等,绘制在图片缓存中,生成图片,response 输出;
页面上的图片标签src 直接指向 Servlet 的映射路径就可以了
--------------------编程问答-------------------- --------------------编程问答-------------------- 以下的代码如何使用,可以用在 *.vm 文件中吗??什么叫做把它放到相应的位置的img标签里就OK了
<%--
Document : image
Created on : 2010-3-8, 15:32:40
Author : Administrator
--%>
<%@ page contentType="image/jpeg" import="java.util.*,java.awt.*,java.io.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<%!
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("randCode",sRand);
// 图象生效
g.dispose();
OutputStream output=response.getOutputStream();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
output.flush();
out.clear();
out = pageContext.pushBody();
%>
</body>
</html>
--------------------编程问答-------------------- mark --------------------编程问答-------------------- 问题是如何校验,在session吗??可是,真的郁闷,session被框架进行了封装。 --------------------编程问答-------------------- 我是来学习的。。。 --------------------编程问答-------------------- 5楼的可以 但是如何在页面提交前能验证验证码呢?
--------------------编程问答-------------------- 我觉得产生验证码的程序应该放在后台,然后拿用户在前台输入的字符与后台的验证码来比较,这样更安全一些,不让别人通过看页面源码直接获取到。
补充:Java , Java SE