本文实例为大家分享了Java使用Servlet生成验证码图片的具体代码,供大家参考,具体内容如下
一、实现思路
1、使用BufferedImage用于在内存中存储生成的验证码图片
2、使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证
3、最后通过ImageIO将生成的图片进行输出
4、页面通过访问servlet来获取并展示验证码
5、在后台获取页面提交的验证码,然后和存放在session中的验证码进行比对,进行校验
二、生成验证码
生成验证码的servlet,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
@WebServlet ( "/code" ) public class CodeController {
@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding( "utf-8" );
BufferedImage bfi = new BufferedImage( 80 , 25 ,BufferedImage.TYPE_INT_RGB); Graphics g = bfi.getGraphics(); g.fillRect( 0 , 0 , 80 , 25 );
//验证码字符范围 char [] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" .toCharArray(); Random r = new Random(); int index; StringBuffer sb = new StringBuffer(); //保存字符串 for ( int i= 0 ; i< 4 ; i++){ index = r.nextInt(ch.length); g.setColor( new Color(r.nextInt( 255 ),r.nextInt( 255 ),r.nextInt( 255 ))); Font font = new Font( "宋体" , 30 , 20 ); g.setFont(font); g.drawString(ch[index]+ "" , (i* 20 )+ 2 , 23 ); sb.append(ch[index]); }
// 添加噪点 int area = ( int ) ( 0.02 * 80 * 25 ); for ( int i= 0 ; i<area; ++i){ int x = ( int )(Math.random() * 80 ); int y = ( int )(Math.random() * 25 ); bfi.setRGB(x, y, ( int ) (Math.random() * 255 )); }
//设置验证码中的干扰线 for ( int i = 0 ; i < 4 ; i++) { //随机获取干扰线的起点和终点 int xstart = ( int )(Math.random() * 80 ); int ystart = ( int )(Math.random() * 25 ); int xend = ( int )(Math.random() * 80 ); int yend = ( int )(Math.random() * 25 ); g.setColor(interLine( 1 , 255 )); g.drawLine(xstart, ystart, xend, yend); }
HttpSession session = request.getSession(); //保存到session session.setAttribute( "verificationCode" , sb.toString());
ImageIO.write(bfi, "JPG" , response.getOutputStream()); //写到输出流
}
private Color interLine( int Low, int High){ if (Low > 255 ) Low = 255 ; if (High > 255 ) High = 255 ; if (Low < 0 ) Low = 0 ; if (High < 0 ) High = 0 ; int interval = High - Low; int r = Low + ( int )(Math.random() * interval); int g = Low + ( int )(Math.random() * interval); int b = Low + ( int )(Math.random() * interval); return new Color(r, g, b); }
} |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
原文链接:https://blog.csdn.net/tangyang8941/article/details/119853780
查看更多关于Java使用Servlet生成验证码图片的详细内容...