zoukankan      html  css  js  c++  java
  • 2017.11.29 JSP+Servlet 中功能验证码及验证的实现

    源代码如下:

    validate.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    <%  
     String path = request.getContextPath();  
     String basePath = request.getScheme() + "://"  
       + request.getServerName() + ":" + request.getServerPort()  
       + path + "/";  
    %>  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <html>  
    <head>  
    <base href="<%=basePath%>">  
    <title>验证码</title>  
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">  
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
    <style type="text/css">  
    .error{  
     background: url(./images/invalid_line.gif) repeat-x bottom;  
     border: 1px solid red;  
    }  
    </style>  
    <script type="text/javascript" src="./js/jquery.js"></script>  
    <script type="text/javascript">  
    $(function(){  
     $("#check").blur(function(){  
      $.ajax({  
       type:'post',  
       url:'check',  
       data: {input: $(this).val()},  
       dataType: "text/json",  
       success: function(msg){  
        var ret = eval('(' + msg + ')');  
        var success = ret.success;  
        $("#tip").html(ret.message);  
          
        if(!success){  
         $(this).val('');  
         $("#image").attr('src',"validate?random="+Math.random());  
         $("#check").addClass("error");  
         $("#tip").css({'color':'red','font-family': '华文楷体'});  
        }else{  
         $("#check").removeClass("error");  
         $("#tip").css({'color':'black','font-family': '华文楷体'});  
        }  
       }  
      });  
     });  
       
     $("#image").click(function(){  
      $(this).attr('src',"validate?random="+Math.random());  
     });  
    });  
    </script>  
    </head>  
    <body>  
     <input type="text" id="check" value="">  
     <div id="tip">&nbsp;</div>  
     <br>  
     <img alt="" src="validate" id="image">  
    </body>  
    </html>  
    

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     version="2.5"  
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
     <servlet-mapping>  
      <servlet-name>validate</servlet-name>  
      <url-pattern>/validate</url-pattern>  
     </servlet-mapping>  
     <servlet>  
      <servlet-name>validate</servlet-name>  
      <servlet-class>test.MyValidateServlet</servlet-class>  
     </servlet>  
     <servlet-mapping>  
      <servlet-name>check</servlet-name>  
      <url-pattern>/check</url-pattern>  
     </servlet-mapping>  
     <servlet>  
      <servlet-name>check</servlet-name>  
      <servlet-class>test.CheckServlet</servlet-class>  
     </servlet>  
    </web-app>  
    

    ValidateCode.java

    package util;  
    import java.awt.Color;  
    import java.awt.Font;  
    import java.awt.Graphics;  
    import java.awt.image.BufferedImage;  
    import java.util.Random;  
    public class ValidateCode {  
     public static final int TYPE_NUM_ONLY = 0;  
     public static final int TYPE_LETTER_ONLY = 1;  
     public static final int TYPE_ALL_MIXED = 2;  
     public static final int TYPE_NUM_UPPER = 3;  
     public static final int TYPE_NUM_LOWER = 4;  
     public static final int TYPE_UPPER_ONLY = 5;  
     public static final int TYPE_LOWER_ONLY = 6;  
     public static String generateTextCode(int type, int length, String exChars) {  
      if (length <= 0) {  
       return "";  
      }  
      StringBuffer code = new StringBuffer();  
      int i = 0;  
      Random r = new Random();  
      switch (type) {  
      case 0:  
       while (i < length) {  
        int t = r.nextInt(10);  
        if ((exChars == null) || (exChars.indexOf(t) < 0)) {  
         code.append(t);  
         i++;  
        }  
       }  
       break;  
      case 1:  
       while (i < length) {  
        int t = r.nextInt(123);  
        if (((t >= 97) || ((t >= 65) && (t <= 90)))  
          && ((exChars == null) || (exChars.indexOf((char) t) < 0))) {  
         code.append((char) t);  
         i++;  
        }  
       }  
       break;  
      case 2:  
       while (i < length) {  
        int t = r.nextInt(123);  
        if (((t < 97) && ((t < 65) || (t > 90)) && ((t < 48) || (t > 57)))  
          || ((exChars != null) && (exChars.indexOf((char) t) >= 0)))  
         continue;  
        code.append((char) t);  
        i++;  
       }  
       break;  
      case 3:  
       while (i < length) {  
        int t = r.nextInt(91);  
        if (((t >= 65) || ((t >= 48) && (t <= 57)))  
          && ((exChars == null) || (exChars.indexOf((char) t) < 0))) {  
         code.append((char) t);  
         i++;  
        }  
       }  
       break;  
      case 4:  
       while (i < length) {  
        int t = r.nextInt(123);  
        if (((t >= 97) || ((t >= 48) && (t <= 57)))  
          && ((exChars == null) || (exChars.indexOf((char) t) < 0))) {  
         code.append((char) t);  
         i++;  
        }  
       }  
       break;  
      case 5:  
       while (i < length) {  
        int t = r.nextInt(91);  
        if ((t >= 65)  
          && ((exChars == null) || (exChars.indexOf((char) t) < 0))) {  
         code.append((char) t);  
         i++;  
        }  
       }  
       break;  
      case 6:  
       while (i < length) {  
        int t = r.nextInt(123);  
        if ((t >= 97)  
          && ((exChars == null) || (exChars.indexOf((char) t) < 0))) {  
         code.append((char) t);  
         i++;  
        }  
       }  
      }  
      return code.toString();  
     }  
     public static BufferedImage generateImageCode(String textCode, int width,  
       int height, int interLine, boolean randomLocation, Color backColor,  
       Color foreColor, Color lineColor) {  
      BufferedImage bim = new BufferedImage(width, height, 1);  
      Graphics g = bim.getGraphics();  
      g.setColor(backColor == null ? getRandomColor() : backColor);  
      g.fillRect(0, 0, width, height);  
      Random r = new Random();  
      if (interLine > 0) {  
       int x = 0;  
       int y = 0;  
       int x1 = width;  
       int y1 = 0;  
       for (int i = 0; i < interLine; i++) {  
        g.setColor(lineColor == null ? getRandomColor() : lineColor);  
        y = r.nextInt(height);  
        y1 = r.nextInt(height);  
        g.drawLine(x, y, x1, y1);  
       }  
      }  
      int fsize = (int) (height * 0.8D);  
      int fx = height - fsize;  
      int fy = fsize;  
      g.setFont(new Font("Default", 0, fsize));  
      for (int i = 0; i < textCode.length(); i++) {  
       fy = randomLocation ? (int) ((Math.random() * 0.3D + 0.6D) * height)  
         : fy;  
       g.setColor(foreColor == null ? getRandomColor() : foreColor);  
       g.drawString(String.valueOf(textCode.charAt(i)), fx, fy);  
       fx = (int) (fx + fsize * 0.9D);  
      }  
      g.dispose();  
      return bim;  
     }  
     public static BufferedImage generateImageCode(int type, int length,  
       String exChars, int width, int height, int interLine,  
       boolean randomLocation, Color backColor, Color foreColor,  
       Color lineColor) {  
      String textCode = generateTextCode(type, length, exChars);  
      BufferedImage bim = generateImageCode(textCode, width, height,  
        interLine, randomLocation, backColor, foreColor, lineColor);  
      return bim;  
     }  
     private static Color getRandomColor() {  
      Random r = new Random();  
      Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));  
      return c;  
     }  
    } 
    

    MyValidateServlet.java

    package test;  
    import java.awt.Color;  
    import java.awt.image.BufferedImage;  
    import java.io.IOException;  
    import java.io.OutputStream;  
    import javax.imageio.ImageIO;  
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    import javax.servlet.http.HttpSession;  
    import util.ValidateCode;  
    public class MyValidateServlet extends HttpServlet {  
     private static final long serialVersionUID = 1L;  
     @Override  
     protected void service(HttpServletRequest req, HttpServletResponse resp)  
       throws ServletException, IOException {  
      resp.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容  
      resp.setHeader("Cache-Control", "no-cache");  
      resp.setDateHeader("Expire", 0);  
      try {  
       String textCode = ValidateCode.generateTextCode(  
         ValidateCode.TYPE_ALL_MIXED, 6, null);  
       BufferedImage image = ValidateCode.generateImageCode(textCode, 500,  
         100, 5, true, Color.GRAY, null, null);  
       HttpSession session = req.getSession(true);  
       session.setAttribute("captcha", textCode);  
       resp.setContentType("image/jpeg");  
       OutputStream outputStream = resp.getOutputStream();  
       ImageIO.write(image, "jpeg", outputStream);  
      } catch (Exception e) {  
       e.printStackTrace();  
      }  
     }  
    }  
    CheckServlet.java
    [java] view plain copy
    package test;  
    import java.io.IOException;  
    import java.io.PrintWriter;  
    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 CheckServlet extends HttpServlet {  
     private static final long serialVersionUID = 1L;  
     @Override  
     protected void service(HttpServletRequest req, HttpServletResponse resp)  
       throws ServletException, IOException {  
      resp.setCharacterEncoding("UTF-8");  
      resp.setContentType("text/html;chartset=UTF-8");  
      req.setCharacterEncoding("UTF-8");  
      String input = (String) req.getParameter("input");  
        
      HttpSession sess = req.getSession();  
      String captcha = (String) sess.getAttribute("captcha");  
      PrintWriter out = resp.getWriter();  
      if(input.toUpperCase().equals(captcha.toUpperCase())){  
       out.print("{'success': true,'message': '验证码正确!'}");  
      }else{  
       out.print("{'success': false,'message': '验证码错误!'}");  
      }  
        
      out.flush();  
      out.close();  
     }  
    }  
    
  • 相关阅读:
    H5 + 3D + AR/VR 综述
    10中典型的软件开发模型
    总线宽度VS总线带宽
    最全程序设计流程、技术、工具、交付结果【软件全生命周期】
    一幅图读懂面向对象和面向过程程序设计的区别!
    C语言实现计算器,附源码,超简单!
    request.getRequestDispatcher()的两个方法forward()/include()!!!
    关于使用ResultSet ---结果集没有当前行
    JComboBox添加item的赋值类型问题!不一致的话会导致不能更改jcombobox的选择值
    关于String的两种赋值方式
  • 原文地址:https://www.cnblogs.com/qichunlin/p/7923256.html
Copyright © 2011-2022 走看看