JavaWeb实现登录验证码示例
JavaWeb实现登录验证码示例
一、页面部分
Java Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <script type= “text/javascript” > function _change(){ var codeimg=document.getElementById( “img” ); codeimg.src= “/verificode/VerifyCodeServlet?a=” + new Date().getTime(); } </script> <body> <font color= “red” ><b> ${msg} </b></font> <form action= “/verificode/Login” method= “post” /> 用户名:<input type= “text” name= “username” /></br> 密 码:<input type= “text” name= “password” /></br> 验证码:<input type= “text” name= “verificode” /> <img id= “img” src= “/verificode/VerifyCodeServlet” /> <a href= “javascript:_change()” >换一张</a><br> <input type= “submit” value= “登录” > </form> </body> |
二、登录Servlet
Java Code
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 | package cn.wj.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding( “utf-8” ); response.setContentType( “text/html;charset=utf-8” ); String username=request.getParameter( “username” ); String password=request.getParameter( “password” ); String v_code=request.getParameter( “verificode” ); HttpSession session=request.getSession(); String v_code2=( String ) session.getAttribute( “session_code” ); if (!v_code.equalsIgnoreCase(v_code2)){ request.setAttribute( “msg” , “验证码错误” ); request.getRequestDispatcher( “/index.jsp” ).forward(request, response); return ; } else { request.getRequestDispatcher( “success.jsp” ).forward(request, response); } } } |
三、验证码生成工具类
Java Code
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | package cn.wj.servlet; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO; public class VerifyCode { private int w = 70 ; private int h = 35 ; private Random r = new Random(); // {“宋体”, ”华文楷体”, ”黑体”, ”华文新魏”, ”华文隶书”, ”微软雅黑”, ”楷体_GB2312”} private String [] fontNames = { “宋体” , “华文楷体” , “黑体” , “微软雅黑” , “楷体_GB2312” }; // 可选字符 private String codes = “23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ” ; // 背景色 private Color bgColor = new Color( 255 , 255 , 255 ); // 验证码上的文本 private String text ; // 生成随机的颜色 private Color randomColor () { int red = r.nextInt( 150 ); int green = r.nextInt( 150 ); int blue = r.nextInt( 150 ); return new Color(red, green, blue); } // 生成随机的字体 private Font randomFont () { int index = r.nextInt(fontNames.length); String fontName = fontNames[index]; //生成随机的字体名称 int style = r.nextInt( 4 ); //生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体) int size = r.nextInt( 5 ) + 24 ; //生成随机字号, 24 ~ 28 return new Font(fontName, style, size); } // 画干扰线 private void drawLine (BufferedImage image) { int num = 3 ; //一共画3条 Graphics2D g2 = (Graphics2D)image.getGraphics(); for ( int i = 0 ; i < num; i++) { //生成两个点的坐标,即4个值 int x1 = r.nextInt(w); int y1 = r.nextInt(h); int x2 = r.nextInt(w); int y2 = r.nextInt(h); g2.setStroke( new BasicStroke( 1 .5F)); g2.setColor(Color.BLUE); //干扰线是蓝色 g2.drawLine(x1, y1, x2, y2); //画线 } } // 随机生成一个字符 private char randomChar () { int index = r.nextInt(codes.length()); return codes.charAt(index); } // 创建BufferedImage private BufferedImage createImage () { BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = (Graphics2D)image.getGraphics(); g2.setColor( this .bgColor); g2.fillRect( 0 , 0 , w, h); return image; } // 调用这个方法得到验证码 public BufferedImage getImage () { BufferedImage image = createImage(); //创建图片缓冲区 Graphics2D g2 = (Graphics2D)image.getGraphics(); //得到绘制环境 StringBuilder sb = new StringBuilder(); //用来装载生成的验证码文本 // 向图片中画4个字符 for ( int i = 0 ; i < 4 ; i++) { //循环四次,每次生成一个字符 String s = randomChar() + “” ; //随机生成一个字母 sb.append(s); //把字母添加到sb中 float x = i 1 .0F w / 4 ; //设置当前字符的x轴坐标 g2.setFont(randomFont()); //设置随机字体 g2.setColor(randomColor()); //设置随机颜色 g2.drawString(s, x, h- 5 ); //画图 } this .text = sb.toString(); //把生成的字符串赋给了this.text drawLine(image); //添加干扰线 return image; } // 返回验证码图片上的文本 public String getText () { return text; } // 保存图片到指定的输出流 public static void output (BufferedImage image, OutputStream out) throws IOException { ImageIO.write(image, “JPEG” , out); } } |
四、验证码Servlet
Java Code
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 | package cn.wj.servlet; import java.awt.image.BufferedImage; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class VerifyCodeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding( “utf-8” ); response.setContentType( “text/html;charset=utf-8” ); VerifyCode vc= new VerifyCode(); BufferedImage img=vc.getImage(); request.getSession().setAttribute( “session_code” , vc.getText()); VerifyCode.output(img, response.getOutputStream()); } } |
还没有评论,来说两句吧...