码上敲享录 > java入门知识分享 > 登录生成随机验证码完整源码分享2017

登录生成随机验证码完整源码分享2017

上一章章节目录下一章 2017-12-06已有1947人阅读 评论(0)

登录生成随机验证码完整源码分享2017


1.新建一个servlet,路径为servlet/ValidateCodeServlet.java

package common.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
@SuppressWarnings("serial")
public class ValidateCodeServlet extends HttpServlet {
   public static final String VALIDATE_CODE = "validateCode";
   private int w = 70;
   private int h = 26;
   public ValidateCodeServlet() {
       super();
   }
   public void destroy() {
       super.destroy();
   }
   public static boolean validate(HttpServletRequest request, String validateCode){
       String code = (String)request.getSession().getAttribute(VALIDATE_CODE);
       return validateCode.toUpperCase().equals(code);
   }
   public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       String validateCode = request.getParameter(VALIDATE_CODE); // AJAX验证,成功返回true
       if (StringUtils.isNotBlank(validateCode)){
           response.getOutputStream().print(validate(request, validateCode)?"true":"false");
       }else{
           this.doPost(request, response);
       }
   }
   public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       createImage(request,response);
   }
   
   private void createImage(HttpServletRequest request,
           HttpServletResponse response) throws IOException {
       
       response.setHeader("Pragma", "no-cache");
       response.setHeader("Cache-Control", "no-cache");
       response.setDateHeader("Expires", 0);
       response.setContentType("image/jpeg");
        //得到参数高,宽,都为数字时,则使用设置高宽,否则使用默认值
       String width = request.getParameter("width");
       String height = request.getParameter("height");
       if (StringUtils.isNumeric(width) && StringUtils.isNumeric(height)) {
           w = NumberUtils.toInt(width);
           h = NumberUtils.toInt(height);
       }
       BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
       Graphics g = image.getGraphics();
       // 生成背景
       createBackground(g);
       // 生成字符
       String s = createCharacter(g);
       request.getSession().setAttribute(VALIDATE_CODE, s);
       g.dispose();
       OutputStream out = response.getOutputStream();
       ImageIO.write(image, "JPEG", out);
       out.close();
   }
   
   private Color getRandColor(int fc,int bc) {
       int f = fc;
       int b = bc;
       Random random=new Random();
       if(f>255) {
           f=255;
       }
       if(b>255) {
           b=255;
       }
       return new Color(f+random.nextInt(b-f),f+random.nextInt(b-f),f+random.nextInt(b-f));
   }
   
   private void createBackground(Graphics g) {
       // 填充背景
       g.setColor(getRandColor(220,250));
       g.fillRect(0, 0, w, h);
       // 加入干扰线条
       for (int i = 0; i < 8; i++) {
           g.setColor(getRandColor(40,150));
           Random random = new Random();
           int x = random.nextInt(w);
           int y = random.nextInt(h);
           int x1 = random.nextInt(w);
           int y1 = random.nextInt(h);
           g.drawLine(x, y, x1, y1);
       }
   }
   private String createCharacter(Graphics g) {
       char[] codeSeq = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
               'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
               'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };
       String[] fontTypes = {"Arial","Arial Black","AvantGarde Bk BT","Calibri"};
       Random random = new Random();
       StringBuilder s = new StringBuilder();
       for (int i = 0; i < 4; i++) {
           String r = String.valueOf(codeSeq[random.nextInt(codeSeq.length)]);

           g.setColor(new Color(50 + random.nextInt(100), 50 +

random.nextInt(100), 50 + random.nextInt(100)));

           g.setFont(new Font(fontTypes[random.nextInt(fontTypes.length)],Font.BOLD,26));
           g.drawString(r, 15 * i + 5, 19 + random.nextInt(8));
           s.append(r);
       }
       return s.toString();
   }
   
}


2.在web.xml配置上述新建的servlet类

<servlet>
<servlet-name>ValidateCodeServlet</servlet-name>
<servlet-class>servlet.ValidateCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ValidateCodeServlet</servlet-name>
<url-pattern>/servlet/validateCodeServlet</url-pattern>
</servlet-mapping>


3.jsp页面代码

<input type="text" />
<img src="${pageContext.request.contextPath}/servlet/validateCodeServlet" onclick="$('.refresh').click();" class="img" /><a href="javascript:" onclick="$('.img').attr('src','${pageContext.request.contextPath}/servlet/validateCodeServlet?'+new Date().getTime());" class="refresh" >看不清</a>




向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti
2

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交