• JAVA生成验证码的问题
  • 发布于 2个月前
  • 439 热度
    2 评论
  • Kion
  • 3 粉丝 12 篇博客
  •   
我现在再做一个招标系统,要有一个给供应商登录报价的功能模块,因该模块需要放公网,所以领导要求在供应商登录系统的时候要有一个验证码的功能,以提高网站的安全性,因以前没用JAVA做过验证码的功能,有谁有现成的生成验证码的功能的例子给一个呗,或者给点指导思路也可以。拜谢!
用户评论
  • 一剑天涯
  • 给你一个例子:

    import java.awt.Color;
    import java.awt.Font;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.imageio.ImageIO;
    import javax.servlet.Servlet;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.lang.math.RandomUtils;
    
    import nl.captcha.Captcha;
    import nl.captcha.Captcha.Builder;
    import nl.captcha.gimpy.BlockGimpyRenderer;
    import nl.captcha.text.producer.ChineseTextProducer;
    import nl.captcha.text.producer.DefaultTextProducer;
    import nl.captcha.text.renderer.DefaultWordRenderer;
    import nl.captcha.text.renderer.WordRenderer;
    
    
    
    public class CaptchaServlet extends HttpServlet implements Servlet {
    	private static final long serialVersionUID = 1L;
    	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 = 150;
    	protected int _height = 40;
    	protected boolean _noise = false;
    	protected String _text = "number:1,word:1,number:1,number:1,word:1";
    
    	/**
    	 * 初始化过滤器.将配置文件的参数文件赋值
    	 * 
    	 * @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_NOISE) != null) {
    			_text = String.valueOf(getInitParameter(PAEAM_TEXT));
    		}
    	}
    
    	/**
    	 * 因为获取图片只会有get方法
    	 */
    	@Override
    	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    		Builder builder = new Captcha.Builder(_width, _height);
    		// 增加边框
    		// builder.addBorder();
    		// 是否增加干扰线条
    		if (_noise == true) {
    			builder.addNoise();
    		}
    		// ----------------自定义字体大小-----------
    		// 自定义设置字体颜色和大小 最简单的效果 多种字体随机显示
    		List<Font> fontList = new ArrayList<Font>();
    		fontList.add(new Font("微软 雅黑", Font.LAYOUT_NO_START_CONTEXT, 30));// 可以设置斜体之类的
    		DefaultWordRenderer dwr = new DefaultWordRenderer(getRandomColor(), fontList);
    		// 加入多种颜色后会随机显示 字体空心
    
    		WordRenderer wr = dwr;
    		// 增加文本,默认为5个随机字符.
    		if (_text == null) {
    			builder.addText();
    		} else {
    			String[] ts = _text.split(",");
    			for (int i = 0; i < ts.length; i++) {
    				String[] ts1 = ts[i].split(":");
    				if ("chinese".equals(ts1[0])) {
    					builder.addText(new ChineseTextProducer(Integer.parseInt(ts1[1])), wr);
    				} else if ("number".equals(ts1[0])) {
    					// 这里没有0和1是为了避免歧义 和字母I和O
    					char[] numberChar = new char[] { '2', '3', '4', '5', '6', '7', '8' };
    					builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr);
    				} else if ("word".equals(ts1[0])) {
    					// 原理同上
    					char[] numberChar = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm', 'n', 'p', 'r',
    							'w', 'x', 'y' };
    					builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr);
    				} else {
    					builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1])), wr);
    				}
    			}
    
    		}
    
    		// --------------添加背景-------------
    		// 设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色
    		// GradiatedBackgroundProducer gbp=new GradiatedBackgroundProducer();
    		// gbp.setFromColor(Color.yellow);
    		// gbp.setToColor(Color.red);
    		// 无渐进效果,只是填充背景颜色
    		// FlatColorBackgroundProducer fbp=new
    		// FlatColorBackgroundProducer(Color.red);
    		// 加入网纹--一般不会用
    		// SquigglesBackgroundProducer sbp=new SquigglesBackgroundProducer();
    		// 没发现有什么用,可能就是默认的
    		// TransparentBackgroundProducer tbp = new
    		// TransparentBackgroundProducer();
    
    		// builder.addBackground(gbp);
    		// ---------装饰字体---------------
    		// 字体边框齿轮效果 默认是3
    		builder.gimp(new BlockGimpyRenderer(1));
    		// 波纹渲染 相当于加粗
    		// builder.gimp(new RippleGimpyRenderer());
    		// 修剪--一般不会用
    		// builder.gimp(new ShearGimpyRenderer(Color.red));
    		// 加网--第一个参数是横线颜色,第二个参数是竖线颜色
    		// builder.gimp(new FishEyeGimpyRenderer(Color.red,Color.yellow));
    		// 加入阴影效果 默认3,75
    		// builder.gimp(new DropShadowGimpyRenderer());
    		// 创建对象
    		Captcha captcha = builder.build();
    
    		req.getSession().setAttribute("simpleCaptcha", captcha);
    		resp.setHeader("Cache-Control", "private,no-cache,no-store");
    		resp.setContentType("image/png");
    		try {
    			OutputStream os = resp.getOutputStream();
    			ImageIO.write(captcha.getImage(), "png", os);
    			os.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public Color getRandomColor() {
    		int n = RandomUtils.nextInt(100);
    
    		if (n % 3 == 1) {
    			return Color.RED;
    		} else if (n % 3 == 2) {
    			return Color.BLUE;
    		}
    		return Color.GREEN;
    	}
    }

  • 2018/4/6 13:21:00 [ 0 ] [ 0 ] 回复
  • 跳不出的循环
  • 生成验证码有很多方式,比如可以生成验证图片,也可以用问答的方式的,比如1+1等于多少这种。不管是哪一种,思路都差不多,比如用图片的,你就后台先用随机函数生成一个随机数,然后把这个函数用Session存储下来,然后在前台把这个数字显示出来,当然为了提高安全性,你可以把数字显示的模糊一点,好让用户认真填写,然后在把用户填写的数字和你存储的数字对比一下,如果一致则通过,否则就不通过。

    1+1等于2 的这种验证你可以在后台存储已整套的题目,然后在前台页面随机从数据库抽取问题,并把用户的回答和这问题的答案做比较就可以了。

    当然以上只是两种简单思路,现在网上也有很多很美妙的js插件,你可以去找一下,希望能帮到你。

  • 2018/4/6 13:19:00 [ 0 ] [ 0 ] 回复