Java 后台生成验证码

Java 后台生成图片验证码

开发工具与关键技术:java、 elipse2019、jdk1.8 
作者:Amewin	
撰写时间:2019年8月17日

介绍

由于很多是时候,我们需要在后台生成验证码,用于前台登陆使用,之所以为什么写在后台是因为相对于前台
生成较于安全。

验证码这块  我在Web  ASP.NET 也有所涉及,在这里,我只提供工具类,相关的调用请自行结合框架使用。
/**
*验证码图片生成工具
*/
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
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 javax.servlet.http.HttpSession;


public class ValidCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 7785319966330896339L;
		//设置字母的大小,大小   
	    private Font mFont = new Font("Times New Roman", Font.PLAIN, 20);   
	    public void init() throws ServletException   
	    {   
	        super.init();   
	    }   
	    Color getRandColor(int fc,int bc)   
	    {   
	        Random random = new Random();   
	        if(fc>255) fc=255;   
	        if(bc>255) bc=255;   
	        int r=fc+random.nextInt(bc-fc);   
	        int g=fc+random.nextInt(bc-fc);   
	        int b=fc+random.nextInt(bc-fc);   
	        return new Color(r,g,b);   
	    }   
	  
	    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException   
	    {   
	        response.setHeader("Pragma","No-cache");   
	        response.setHeader("Cache-Control","no-cache");   
	        response.setDateHeader("Expires", 0);   
	        //表明生成的响应是图片   
	        response.setContentType("image/jpeg");   
	           
	        int width=80, height=18;   
	        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   
	           
	        Graphics g = image.getGraphics();   
	        Random random = new Random();   
	        g.setColor(getRandColor(200,250));   
	        g.fillRect(1, 1, width-1, height-1);   
	        g.setColor(new Color(102,102,102));   
	        g.drawRect(0, 0, width-1, height-1);   
	        g.setFont(mFont);   
	  
	        g.setColor(getRandColor(160,200));   
	  
	        //画随机线   
	        for (int i=0;i<155;i++)   
	        {   
	            int x = random.nextInt(width - 1);   
	            int y = random.nextInt(height - 1);   
	            int xl = random.nextInt(6) + 1;   
	            int yl = random.nextInt(12) + 1;   
	            g.drawLine(x,y,x + xl,y + yl);   
	        }   
	  
	        //从另一方向画随机线   
	        for (int i = 0;i < 70;i++)   
	        {   
	            int x = random.nextInt(width - 1);   
	            int y = random.nextInt(height - 1);   
	            int xl = random.nextInt(12) + 1;   
	            int yl = random.nextInt(6) + 1;   
	            g.drawLine(x,y,x - xl,y - yl);   
	        }   
	  
	        //生成随机数,并将随机数字转换为字母   
	        String sRand="";   
	        for (int i=0;i<4;i++)   
	        {   
	            int itmp = random.nextInt(26) + 65;   
	            char ctmp = (char)itmp;   
	            sRand += String.valueOf(ctmp);   
	            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));   
	            g.drawString(String.valueOf(ctmp),15*i+10,16);   
	        }   
	  
	        HttpSession session = request.getSession(true);   
	        System.out.println(sRand);
	        session.setAttribute("code",sRand);   
	        g.dispose();   
	        ImageIO.write(image, "JPEG", response.getOutputStream());   
	    }   
	  
	}



参考演示,及调用

主要是帮助对jsp /html 测试用例,提供便利。

/**
*html 测试样式
*/
<div class="input-group-addon" style="padding:0">
	<img src="validCodeServlet" id="ValidateCode" style="width:115px;height:32px" />
</div>
/**
*js 调用示例 测试样式
*/
<script language="JavaScript">
	//避免登录页面嵌套在其他页面的操作
	$(function() {
		if (window.top.location.href != location.href) {
			window.top.location.href = location.href
		}
	})

	//点击验证码实现验证码的切换
	$("#ValidateCode").click(function() {
		//在执行的方法路径后面加上时间戳或者随机数是处理浏览器页面缓存的问题。
		//浏览器是基于url进行缓存,如果页面允许缓存,则在一定的时间内再次访问相同的url
		//浏览器就不会发送请求到服务器,而是直接从缓存中获取指定的资源。
		//我们需要实现每一次点击验证码的切换,就必须使用随机数或者时间戳。
		$("#ValidateCode").attr("src", "validCodeServlet?time=" + new Date().getTime());
	});
	<script>

示例

在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值