JSP动态生成数字验证码图片

写了几次博客之后发现自己的代码块的代码都是一个颜色,看到别人的代码都是彩色的,满心羡慕,原来在代码块的三个点后边加上自己的语言就行了(例如```java)现在我的也是彩色的了,哈哈哈哈。。。
下面来介绍一下我的验证码,搞了一下午。。。。。。

<%@ page contentType="image/jpeg" import="java.awt.*, 
java.awt.image.*,java.util.*,javax.imageio.*" %> 
<%! 
Color getRandColor(int fc,int bc)     //用于随机生成RGB颜色的方法
{ 
Random random = new Random(); 
if(fc>255) fc=255; 
if(bc>255) bc=255; 
int r=fc+random.nextInt(bc-fc);     //随机生成R值
int g=fc+random.nextInt(bc-fc);    //随机生成G值
int b=fc+random.nextInt(bc-fc);    //随机生成B值
return new Color(r,g,b);     //返回RGB的值
} 
%> 

<% 
out.clear();  //清除缓存
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();   //生成image类的getGraphics,用于绘制操作
Random random = new Random();    //实例化一个Random对象,生成随机类
g.setColor(getRandColor(200,250));   //设置getGraphics类的背景颜色
g.fillRect(0, 0, width, height);   //填充矩形背景的XY坐标和宽高,起始坐标为(0,0)
g.setFont(new Font("Times New Roman",Font.PLAIN,18)); 
//设置验证码的字体 Font.PLAIN为普通字体,如果要使字体加粗的话应该使用Font.BOLD 
g.setColor(getRandColor(160,200));   //设置线条颜色
for (int i=0;i<155;i++)   //随机产生155条干扰线
{ 
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); //在背景图上绘制直线,四个参数表示X坐标,Y坐标,宽,高
} 
String sRand="";  //输出随机的验证码
for (int i=0;i<4;i++){ 
String rand=String.valueOf(random.nextInt(10)); 
//rand是生成0-10之间的数,包括0不包括10,即生成的数为0-9
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.setAttribute("random",sRand);   //将验证码保存到session当中
g.dispose(); 
//销毁图片类的对象,如果在使用了graphics获得windows一些图形资源,而不进行关闭的话,由于后期多人使用就会造成内存溢出的情况的,导致程序卡死。
ImageIO.write(image, "JPEG", response.getOutputStream()); //指定图片的格式为JPEG
%>

打开WEB-INF/web.xml文件,在该文件中配置生成验证码的servlet。在配置该servlet时,主要是通过标记先配置servlet文件,然后再通过标记配置一个映射路径,用于使用该servlet。

<servlet>
    <servlet-name>QRCode</servlet-name>
    <servlet-class>servlet.QRCode</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>QRCode</servlet-name>
    <url-pattern>/QRCode</url-pattern>
</servlet-mapping>	

在前端页面上:

<tr>
            <td style="width:200px;height:60px">
                   <span class="STYLE9"><font color="black" size="4">验证码:</font></span>
            </td>
            <td style="width:100px;height:60px">
                 <input name="pagerandom" type="text" id="pagerandom" style=" height:30px;width:90px; border:solid 1px                           #000000; color:#666666; " >
             </td>
            <td width="102">
            <a style="margin-left:10px" href="javascript:loadimage();">
            <img alt="看不清请点我!" name="randImage" id="randImage" src="image.jsp" width="70" height="20" border="1" align="absmiddle"> </a>
            </td> 
</tr>

页面显示效果:
在这里插入图片描述

你可能感兴趣的:(java)