后台生成随机验证码,前台显示

  • 在项目中手动引入simplecaptcha-1.2.1.jar或在pom.xml中引入
<dependency>
    <groupId>nl.captcha</groupId>
    <artifactId>simplecaptcha</artifactId>
    <version>1.2.1</version>
</dependency>
  • 在web.xml中增加配置,设置验证码的宽高和个数
  •     <servlet>    
            <servlet-name>StickyCaptcha</servlet-name>    
           <!--  <servlet-class>nl.captcha.servlet.StickyCaptchaServlet</servlet-class>    --> 
           	<servlet-class>org.jasig.cas.web.SimpleCaptchaFilter</servlet-class> 
            <init-param>    
                <param-name>width</param-name>    
                <param-value>120</param-value>    
            </init-param>    
            <init-param>    
                <param-name>height</param-name>    
                <param-value>38</param-value>    
            </init-param>  
          	<!-- 验证码个数 -->  
          	<init-param>  
              	<param-name>text</param-name>  
              	<param-value>4</param-value>  
          	</init-param> 
        </servlet>

     

  • 在需要引入随机验证码的jsp页面中添加验证码标签
<div style="width: 250px">
    <img src="/cas/stickyImg" id="validate" style="border-radius:4px;height:36px;" onclick="getNewPic()"/>                    	
    <form:input name="validateCode" id="validateCode" class="form-control" style="width:120px;" tabindex="3" size="25" path="validateCode" />
</div>

<script>
    function getNewPic(){
	    $("#validate").attr("src","/cas/stickyImg?seed="+ RndNum(5)); 
    }
    function RndNum(n){
        var rnd="";
        for(var i=0;i<n;i++)
            rnd	+=	Math.floor(Math.random()*10);
        return rnd;
    }
</script>

  • 创建captchaSubmit.jsp,与需要添加随机验证码的jsp放在同一目录下
    <%@ page import="nl.captcha.Captcha" %>
    ...
    <% // We're doing this in a JSP here, but in your own app you'll want to put
    // this logic in your MVC framework of choice.
    Captcha captcha = (Captcha) session.getAttribute(Captcha.NAME);
    // Or, for an AudioCaptcha:
    // AudioCaptcha captcha = (AudioCaptcha) session.getAttribute(Captcha.NAME);
    request.setCharacterEncoding("UTF-8"); // Do this so we can capture non-Latin chars
    String answer = request.getParameter("answer");
    if (captcha.isCorrect(answer)) { %>
        <b>Correct!</b>
    <% } %>
  • 创建SimpleCaptchaFilter.java
package org.jasig.cas.web;

import static nl.captcha.Captcha.NAME;  

import java.awt.Color;  
import java.awt.Font;  
import java.io.IOException;  
import java.util.ArrayList;  
import java.util.List;  

import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  

import nl.captcha.Captcha;
import nl.captcha.backgrounds.GradiatedBackgroundProducer;
import nl.captcha.gimpy.FishEyeGimpyRenderer;
import nl.captcha.servlet.CaptchaServletUtil;  


public class SimpleCaptchaFilter extends HttpServlet{  

    private static final String PARAM_HEIGHT = "height"; //高度 默认为50  

    private static final String PARAM_WIDTH = "width";//宽度 默认为200  

    private static final String PAEAM_NOISE="noise";//干扰线条 默认是没有干扰线条  

    private static final String PAEAM_TEXT="text";//文本  

    protected int _width = 200;  
    protected int _height = 50;  
    protected boolean _noise=false;  
    protected int _text = 4;  

    /** 
     * 初始化过滤器.将配置文件的参数文件赋值 
     * @throws ServletException 
     */  
    @Override  
      public void init() throws ServletException {  
          if (getInitParameter(PARAM_HEIGHT) != null) {  
              _height = Integer.valueOf(getInitParameter(PARAM_HEIGHT));  
          }  

          if (getInitParameter(PARAM_WIDTH) != null) {  
              _width = Integer.valueOf(getInitParameter(PARAM_WIDTH));  
          }  

          if (getInitParameter(PAEAM_NOISE) != null) {  
              _noise = Boolean.valueOf(getInitParameter(PAEAM_NOISE));  
          }  

          if (getInitParameter(PAEAM_TEXT) != null) {  
              _text = Integer.valueOf(getInitParameter(PAEAM_TEXT));  
          }  
      }  

    /** 
     * 因为获取图片只会有get方法 
     */  
     @Override  
    public void doGet(HttpServletRequest req, HttpServletResponse resp)  
          throws ServletException, IOException {  
    	 
         //----------------自定义字体大小-----------  
         //自定义设置字体颜色和大小 最简单的效果 多种字体随机显示  
         List<Font> fontList = new ArrayList<Font>();
         fontList.add(new Font("宋体", Font.HANGING_BASELINE, 40));// 可以设置斜体之类的
         fontList.add(new Font("Courier", Font.ITALIC, 40));
         fontList.add(new Font("宋体", Font.PLAIN, 40)); 

       //--------------添加背景-------------  
         //设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色  
        GradiatedBackgroundProducer gbp = new GradiatedBackgroundProducer();
 		gbp.setFromColor(Color.black);
 		gbp.setToColor(Color.black); 
        
        Captcha captcha = new Captcha.Builder(_width, _height)
        		               .addText(new EasyCharTextProducer(_text),
        		                       new FixedWordRenderer(new Color(250, 160, 0), fontList))
        		                .gimp(new FishEyeGimpyRenderer(new Color(145, 165, 192),new Color(145, 165, 192)))
        		                .addBackground(gbp).addBorder().build();

     CaptchaServletUtil.writeImage(resp, captcha.getImage());  
     req.getSession().setAttribute(NAME, captcha);  
  }  
} 
  • 创建EasyCharTextProducer.java

 

package org.jasig.cas.web;

import java.util.Random;

import nl.captcha.text.producer.TextProducer;

public class EasyCharTextProducer implements TextProducer {

//    private static final char[] chars = { 'A', 'B', 'C', 'D', 'E',
//    			'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
//    			'去','子','也','和','下','天', '6', '8', '3', '4',
//				'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 
//				'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'a', 'b', 'c', 
//				'他','这','上','个','大','里', '6', '8', '3', '4',
//				'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
//				'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 
//				'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
//				'y', '6', '8','3', '4', '7', '5', '你', '我', '他',
//				'的','一','了','是','我','不','在','人','们','有','来',
//				'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
//				'出','小','么','你','多','没','为','又','可'};
	
		private static final char[] chars = { 'A', 'B', 'C', 'D', 'E',
				'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
				'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 
				'6', '8', '3', '4', '5', '7', '3', '4', '6', '5',
				'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'a', 'b', 'c', 
				'6', '8', '3', '4', '5', '7', '3', '4', '6', '5',
				'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
				'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
				'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 
				'y', '6', '8', '3', '4', '7', '5', 'k', 'm', 'n',
				'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',};

    private static final int lastChar = chars.length;

    private int length;

    public EasyCharTextProducer() {
        this(5);
    }

    public EasyCharTextProducer(int length) {
        super();
        this.length = length;
    }

    public String getText() {
        Random random = new Random();
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            int r = random.nextInt(lastChar);
            sb.append(chars[r]);
        }
        return sb.toString();
    }

}
  • 创建FixedWordRenderer.java
package org.jasig.cas.web;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import nl.captcha.text.renderer.WordRenderer;

public class FixedWordRenderer implements WordRenderer {
    // The text will be rendered 25%/5% of the image height/width from the X and
    // Y axes
    private static final double YOFFSET = 0.20;
    private static final double XOFFSET = 0.15;
    private static final int charDistance = 5;
    private static final Color DEFAULT_COLOR = Color.BLACK;
    private static final List<Font> DEFAULT_FONTS = new ArrayList<Font>();

    private final Color _color;
    private final List<Font> _fonts;

    static {
        DEFAULT_FONTS.add(new Font("Arial", Font.BOLD, 40));
        DEFAULT_FONTS.add(new Font("Courier", Font.BOLD, 40));
    }

    /**
     * Will render the characters in black and in either 40pt Arial or Courier.
     */
    public FixedWordRenderer() {
        this(DEFAULT_COLOR, DEFAULT_FONTS);
    }

    public FixedWordRenderer(Color color, List<Font> fonts) {
        _color = color != null ? color : DEFAULT_COLOR;
        _fonts = fonts != null ? fonts : DEFAULT_FONTS;
    }

    /**
     * Render a word onto a BufferedImage.
     * 
     * @param word
     *            The word to be rendered.
     * @param bi
     *            The BufferedImage onto which the word will be painted on to
     */
    public void render(String word, BufferedImage image) {
        Random random = new Random();
        Graphics2D g = image.createGraphics();

        RenderingHints hints = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        hints.add(new RenderingHints(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY));
        g.setRenderingHints(hints);

        g.setColor(_color);
        FontRenderContext frc = g.getFontRenderContext();
        int startPosX = (int) Math.round(image.getWidth() * XOFFSET);
        int startPosY = image.getHeight()
                - (int) Math.round(image.getHeight() * YOFFSET);
        char[] wc = word.toCharArray();
        for (char element : wc) {
            char[] itchar = new char[] { element };
            int choiceFont = random.nextInt(_fonts.size());
            Font itFont = _fonts.get(choiceFont);
            g.setFont(itFont);

            GlyphVector gv = itFont.createGlyphVector(frc, itchar);
            double charWitdth = gv.getVisualBounds().getWidth();

            g.drawChars(itchar, 0, itchar.length, startPosX, startPosY);
            startPosX = startPosX + (int) charWitdth
                    + random.nextInt(charDistance) - 2;
        }
    }

}
  •  最终效果,鼠标点击验证码进行自动刷新

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值