JAVA验证码生成问题

发布网友 发布时间:2022-04-23 22:41

我来回答

2个回答

热心网友 时间:2023-10-12 12:56

贴一点我找的代码吧
例程7-11 check_code.html

<h3>带有验证码的登录页面</h3>

<form action="servlet/LogonFormServlet" method="post">

用户名:<input type="text" name="name"><br>

密 码:<input type="password" name="pass"><br>

验证码:<input type="text" name="check_code">

<img src="servlet/CheckCodeServlet"><br>

<input type="submit" value="登录">

</form>

例程7-12 CheckCodeServlet.java

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.ImageIO;

public class CheckCodeServlet extends HttpServlet

{

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.setContentType("image/jpeg");

ServletOutputStream sos = response.getOutputStream();

//设置浏览器不要缓存此图片

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires", 0);

//创建内存图象并获得其图形上下文

BufferedImage image =

new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

//产生随机的认证码

char [] rands = generateCheckCode();

//产生图像

drawBackground(g);

drawRands(g,rands);

//结束图像的绘制过程,完成图像

g.dispose();

//将图像输出到客户端

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ImageIO.write(image, "JPEG", bos);

byte [] buf = bos.toByteArray();

response.setContentLength(buf.length);

//下面的语句也可写成:bos.writeTo(sos);

sos.write(buf);

bos.close();

sos.close();

//将当前验证码存入到Session中

session.setAttribute("check_code",new String(rands));

//直接使用下面的代码将有问题,Session对象必须在提交响应前获得

//request.getSession().setAttribute("check_code",new String(rands));

}

private char [] generateCheckCode()

{

//定义验证码的字符表

String chars = "01234567abcdefghijklmnopqrstuvwxyz";

char [] rands = new char[4];

for(int i=0; i<4; i++)

{

int rand = (int)(Math.random() * 36);

rands[i] = chars.charAt(rand);

}

return rands;

}

private void drawRands(Graphics g , char [] rands)

{

g.setColor(Color.BLACK);

g.setFont(new Font(null,Font.ITALIC|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);

}

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);

}

}

}

例程7-13 LogonFormServlet.java

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class LogonFormServlet extends HttpServlet

{

public void service(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException

{

response.setContentType("text/html;charset=GB2312");

PrintWriter out = response.getWriter();

HttpSession session = request.getSession(false);

if(session == null)

{

out.println("验证码处理问题!");

return;

}

String savedCode = (String)session.getAttribute("check_code");

if(savedCode == null)

{

out.println("验证码处理问题!");

return;

}

String checkCode = request.getParameter("check_code");

if(!savedCode.equals(checkCode))

{

/*验证码未通过,不从Session中清除原来的验证码,

以便用户可以后退回登录页面继续使用原来的验证码进行登录*/

out.println("验证码无效!");

return;

}

/*验证码检查通过后,从Session中清除原来的验证码,

以防用户后退回登录页面继续使用原来的验证码进行登录*/

session.removeAttribute("check_code");

out.println("验证码通过,服务器正在校验用户名和密码!");

}

}
编译上面的两个Java源文件,确保编译后生成的class文件存放在了<tomcat安装目录>\webapps\it315\WEB-INF\classes目录中。将check_code.html文件保存在<tomcat安装目录>\webapps\it315目录中。

(2)在<tomcat安装目录>\webapps\it315\WEB-INF\web.xml文件中注册有关的Servlet,并设置其映射URL。在web.xml文件中的相应位置处增加如下两段内容:

<servlet>

<servlet-name>CheckCodeServlet</servlet-name>

<servlet-class>CheckCodeServlet</servlet-class>

</servlet>

<servlet>

<servlet-name>LogonFormServlet</servlet-name>

<servlet-class>LogonFormServlet</servlet-class>

</servlet>

……

<servlet-mapping>

<servlet-name>CheckCodeServlet</servlet-name>

<url-pattern>/servlet/CheckCodeServlet</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>LogonFormServlet</servlet-name>

<url-pattern>/servlet/LogonFormServlet</url-pattern>

</servlet-mapping>

保存web.xml文件后,重新启动Tomcat。

(3)在浏览器地址栏中输入如下地址:

http://localhost:8080/it315/check_code.html

浏览器中显示出如图7.25所示的效果,然后就可以对验证码的功能进行测试了

热心网友 时间:2023-10-12 12:56

你的肯定是没有图片输出
一般而言,可能原因为:
1、你的验证码图片生成的时候没有任何信息,是个“空”图片
2、你忘记了向页面输出图片输出流
3、你输出的页面和你本来想输的页面不是同一页面

最好的解决方式:上网搜成熟的代码 验证码图片生成也不是很复杂的事情
其次:按顺序好好检查下代码
最后:放弃吧~!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com