java实现验证码登录

java实现验证码的步骤:

1.创建验证码的实体类,代码如下

 
  1. import java.awt.BasicStroke;  
  2. import java.awt.Color;  
  3. import java.awt.Font;  
  4. import java.awt.Graphics2D;  
  5. import java.awt.image.BufferedImage;  
  6. import java.io.IOException;  
  7. import java.io.OutputStream;  
  8. import java.util.Random;  
  9.   
  10. import javax.imageio.ImageIO;  
  11.   
  12.   
  13.   
  14. public class VerifyCode {  
  15.     /**  
  16.      *楠岃瘉鐮�  
  17.      * @author 瑕冧匠鍗�  
  18.      */  
  19.       
  20.     private int w = 50;  
  21.     private int h = 25;  
  22.     private Random r = new Random();  
  23.     private String[] fontNames = {"瀹嬩綋","鍗庢枃妤蜂綋","榛戜綋","寰�蒋闆呴粦","妤蜂綋_GB2312"};  
  24.     private String codes = "23456789abcdefghjkmnpqrstuvwxyzABCEFGHIJKLMNPQRSTUVWXYZ";  
  25.     private Color bgColor = new Color(255,255,255);  
  26.     private String text;  
  27.       
  28.     private Color randomColor(){  
  29.         int red = r.nextInt(200);  
  30.         int green = r.nextInt(200);  
  31.         int blue = r.nextInt(200);  
  32.         return new Color(red,green,blue);  
  33.     }  
  34.       
  35.     private Font randomFont(){  
  36.         int index = r.nextInt(fontNames.length);  
  37.         String fontName = fontNames[index];  
  38.         int style = r.nextInt(4);  
  39.         int size = r.nextInt(6)+15;  
  40.         return new Font(fontName,style,size);  
  41.         }  
  42.     private void drawLine(BufferedImage image){  
  43.         int num = 3;  
  44.         Graphics2D g2 = (Graphics2D)image.getGraphics();  
  45.         for(int i=0;i<num;i++){  
  46.             int x1 = r.nextInt();  
  47.             int y1 = r.nextInt();  
  48.             int x2 = r.nextInt();  
  49.             int y2 = r.nextInt();  
  50.             g2.setStroke(new BasicStroke(1.5F));  
  51.             g2.setColor(Color.BLUE);  
  52.             g2.drawLine(x1,y1,x2,y2);  
  53.         }  
  54.     }  
  55.     private char randomChar(){  
  56.         int index = r.nextInt(codes.length());  
  57.         return codes.charAt(index);  
  58.     }  
  59.     private BufferedImage createImage(){  
  60.         BufferedImage image = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);  
  61.         Graphics2D g2 = (Graphics2D)image.getGraphics();  
  62.         g2.setColor(this.bgColor);  
  63.         g2.fillRect(0, 0, w, h);  
  64.         return image;  
  65.     }  
  66.     public BufferedImage getImage(){  
  67.         BufferedImage image = createImage();  
  68.         Graphics2D g2 = (Graphics2D)image.getGraphics();  
  69.         StringBuilder sb = new StringBuilder();  
  70.         for(int i= 0;i<4;i++){  
  71.             String s = randomChar()+"";  
  72.             sb.append(s);  
  73.             float x = i*1.0F*w/4;  
  74.             g2.setFont(randomFont());  
  75.             g2.setColor(randomColor());  
  76.             g2.drawString(s, x, h-5);  
  77.         }  
  78.         this.text = sb.toString();  
  79.         drawLine(image);  
  80.         return image;  
  81.     }  
  82.     public String getText(){  
  83.     return text;  
  84.     }  
  85.     public static void output (BufferedImage image,OutputStream out) throws IOException{  
  86.         ImageIO.write(image, "JPEG", out);  
  87.     }  
  88. }  
  89.       

2.创建验证码的servlet

 
  1. import java.awt.image.BufferedImage;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import javax.imageio.ImageIO;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.annotation.WebServlet;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10. import util.VerifyCode;  
  11.   
  12. @WebServlet("/VerifyCodeServlet")  
  13. public class VerifyCodeServlet extends HttpServlet {  
  14.   
  15.     /**  
  16.      * Servlet  
  17.      * @author weiqiang  
  18.      */  
  19.       
  20.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.           
  23.         VerifyCode vc = new VerifyCode();  
  24.         response.setHeader("Cache-Control", "no-cache");  
  25.         response.setContentType("image/jpeg");  
  26.         BufferedImage bim = vc.getImage();  
  27.         ImageIO.write(bim, "JPEG", response.getOutputStream());  
  28.         String verifycode = vc.getText();  
  29.         request.getSession().setAttribute("verifyCode", verifycode);  
  30.     }  
  31.   
  32.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  33.             throws ServletException, IOException {  
  34.             doGet(request, response);  
  35.     }  
  36.     public void destroy(){  
  37.         super.destroy();  
  38.     }  
  39.     public void init() throws ServletException{   
  40.     }  
  41.   
  42. }  
  43. 3.在xml中进行配置
  44. servlet>
    <servlet-name>VerifyCodeServlet</servlet-name>
    <servlet-class>cn.com.shxt.servlet.VerifyCodeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>VerifyCodeServlet</servlet-name>
    <url-pattern>/VerifyCodeServlet</url-pattern>
    </servlet-mapping>


3.在需要使用验证码的地方使用如下代码:

[html] view plain copy
 
  1. <!--这是看不清刷新一下的函数-->  
  2. <script>  
  3. function changeVerifyCode(){  
  4.     document.getElementById("validateCodeImg").src="VerifyCodeServlet?t="+Math.random();  
  5.       
  6. }  
  7. </script>  
  8. <!-- 这是输入验证码的输入框-->  
  9. <INPUT id=txtSN size=name=txtSN>  
  10. <!-- 这是显示的验证码,以图片显示-->  
  11. <!-- src的路劲为servlet的路劲 -->  
  12.                   <img src="<%=basePath%>VerifyCodeServlet" border=id="validateCodeImg" style="height: 25px;  57px"/><href="#" onclick="changeVerifyCode()">看不清?换一张</a></TD>  


4.实际效果如下

String code = request.getParameter("code");
String verifyCode = (String) request.getSession().getAttribute("verifyCode");

else if(!code.equals(verifyCode)){//登陆失败
request.setAttribute("message","验证码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);

前台的code和session中的验证码进行比较,实现验证码的功能。

原文地址:https://www.cnblogs.com/yuxiliang/p/6537611.html