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();  
 }  
}  
posted @ 2017-11-29 23:07  LegendQi  阅读(198)  评论(0编辑  收藏  举报