自己封装的验证码工具类以及登录验证

1.验证码CreateYZMCodeUtils工具类

package com.han.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
 * 生成验证码的工具类
 * 自己封装的
 * @author issuser
 *
 */
public class CreateYZMCodeUtils {
	private Integer width;//验证码图片宽度
	private Integer height;//验证吗图片高度
	private Integer num;//验证码的个数
	private String code;//生成验证码一组字符串
	
	private static final Random ran=new Random();//随机数
    private static CreateYZMCodeUtils createYZMCodeUtils;
    /**
     * 通过默认构造初始化参数
     */
    private CreateYZMCodeUtils(){
    	width=100;
    	height=30;
    	code="123456789adcdefghijklmnopqrstuvwxyz";
    	num=4;
    }
    /**
     * 利用单利模式创建该验证码工具类
     * @return
     */
    public static CreateYZMCodeUtils getInstance(){
    	if(createYZMCodeUtils==null){
    		createYZMCodeUtils=new CreateYZMCodeUtils();
    	}
    	return createYZMCodeUtils;
    }
	public Integer getWidth() {
		return width;
	}

	public void setWidth(Integer width) {
		this.width = width;
	}

	public Integer getHeight() {
		return height;
	}

	public void setHeight(Integer height) {
		this.height = height;
	}

	public Integer getNum() {
		return num;
	}

	public void setNum(Integer num) {
		this.num = num;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public static Random getRan() {
		return ran;
	}
	public void setCreateYZMCodeUtils(Integer width,Integer height,Integer num,String code){
		this.width=width;
		this.height=height;
		this.num=num;
		this.code=code;
	}
	public void setCreateYZMCodeUtils(Integer width,Integer height,String code){
		this.width=width;
		this.height=height;
		this.code=code;
	}
	/**
	 * 随机生成验证码
	 * @param code 生成验证码的一组字符串
	 * @return
	 */
	public String getCreateYZMCode(){
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < num; i++) {
			sb.append(code.charAt(ran.nextInt(code.length())));
		}
		return sb.toString();
	}
	/**
	 * 生成buffere Image图片
	 * @param finshCode 生成好的验证码字符串
	 * @return
	 */
	public BufferedImage getCreateYZMImg(String finshCode){
		// 创建BufferedImage对象
		BufferedImage img = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
		Graphics2D graphic = img.createGraphics();// 创建画笔
		graphic.setColor(Color.WHITE);// 设置颜色
		graphic.fillRect(0, 0, width, height);//是用预定的颜色填充一个矩形,得到一个着色的矩形块。
		graphic.setColor(Color.black);
		graphic.drawRect(0, 0, width - 1, height - 1);// 画正方形
		// 设置字体 风格 风格 高度
		Font font = new Font("宋体", Font.BOLD + Font.ITALIC,(int) (height * 0.8));
		graphic.setFont(font);
		for (int i = 0; i < num; i++) {
			// 随机设置字体RGB颜色
			graphic.setColor(new Color(ran.nextInt(255), ran.nextInt(255),ran.nextInt(255)));
			// 画出验证码
			graphic.drawString(String.valueOf(finshCode.charAt(i)), i* (width / num) + 4, (int) (height * 0.8));
		}
		for (int i = 0; i < (width + height); i++) {
			// 随机设置字体RGB颜色
			graphic.setColor(new Color(ran.nextInt(255), ran.nextInt(255),ran.nextInt(255)));
			// 生成干扰点
			graphic.drawOval(ran.nextInt(width), ran.nextInt(height), 1, 1);
		}
		for(int i = 0; i <2; i++){
			// 随机设置字体RGB颜色
			graphic.setColor(new Color(ran.nextInt(255), ran.nextInt(255),ran.nextInt(255)));
			// 随机生成干扰线
			graphic.drawLine(0, ran.nextInt(height), width,ran.nextInt(height));
		}
		return img;
	}
}

2.Controller控制器的调用

package com.han.controller;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.han.model.User;
import com.han.service.UserServ;
import com.han.util.CreateYZMCodeUtils;
import com.han.util.Md5Utils;

@Controller
public class AdminController {
	@Resource(name="userServ")
	private UserServ userServ;
	@RequestMapping("/admin")
	public String index() {
		return "admin/index";
	}

	/**
	 * 跳转至登录页面
	 * 
	 * @return
	 */
	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public String login() {
		return "admin/login";
	}
	/**
	 * 验证登录
	 * @param username 用户名
	 * @param password 登录密码
	 * @param checkCode 验证码
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public String login(String username,String password,String checkCode,HttpSession session,Model model) {
		String code=(String) session.getAttribute("code");
		User user = this.userServ.loadByUserName(username);
		if(user==null){
			model.addAttribute("userError", "用户名或密码不正确!");
			return "admin/login";
		} 
		//验证密码
		String md5 = Md5Utils.Md5(password);
		if(!user.getPassword().equals(md5)){
			model.addAttribute("userError", "用户名或密码不正确!");
			return "admin/login";
		}
		if(code!=null && !code.equals(checkCode)){
			model.addAttribute("codeError", "验证码不正确,请重新输入!");
			return "admin/login";
		}
		session.setAttribute("loginUser", user);
		return "redirect:/admin";
	}

	/**
	 * 生成验证码图片
	 * 
	 * @param response
	 * @param session
	 */
	@RequestMapping("/createYZM")
	public void createYZM(HttpServletResponse response, HttpSession session) {
		OutputStream out = null;
		try {
			// 设置响应类型
			response.setContentType("image/jpg");
			// 获取创建验证码工具类实例
			CreateYZMCodeUtils yzm = CreateYZMCodeUtils.getInstance();
			// 获取生成的验证码字符串
			String code = yzm.getCreateYZMCode();
			// 将验证码存放在session
			session.setAttribute("code", code);
			// 获取验证码图片
			BufferedImage img = yzm.getCreateYZMImg(code);
			out = response.getOutputStream();
			// 通过ImageIO写出图片
			ImageIO.write(img, "jpg", out);
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

3.jsp登录页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/resources/css/admin/login.css"/>
<script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/jquery.validate.js"></script>
<script type="text/javascript" src="<%=request.getContextPath() %>/resources/js/core/jquery.cms.validate.js"></script>
<title>后台管理登录</title>
<script type="text/javascript">
$(function(){
 	$("#myForm").cmsvalidate();
});
function reCheckcode(img) {
        //后面跟一个随机数方便每次请求都是一个新的请求,刷新验证码,防止会在缓存中去验证码图片
	img.src="createYZM?"+Math.random();
}

</script>
</head>
<body>
	<div id="container">
		<div id="top">
		
		</div>
		<div id="content">
			<div id="loginForm">
			       <p style="color: red;margin-left: 98px">${userError}</p>
			       <form action="" id="myForm"  method="post">
					<table cellpadding="0" cellspacing="0" width="380px" id="loginTable">
						<tr>
							<td align="right" width="90">登录用户:</td>
							<td align="left"><input type="text" name="username" size="18"/> </td>
						</tr>
						<tr>
							<td align="right">登录密码:</td>
							<td align="left"><input type="password"  name="password" size="18"/></td>
						</tr>
						<tr>
							<td align="right">验证码:</td>
							<td align="left">
							<input type="text" name="checkCode" id="validateCode" size="10"/>
							${codeError}
							</td>
						</tr>
						<tr>
							<td align="left" colspan="2">
							<span style="margin-left:94px;cursor:pointer">
							<img src="createYZM" οnclick="reCheckcode(this)"/></span>
							</td>
						</tr>
						<tr>
							<td align="center" colspan="2">
								<input type="submit" value="登录">   <input type="reset" value="重置"/>
							</td>
						</tr>
					</table>
					</form>
			</div>
		</div>
	</div>	
</body>
</html>




使用过程注意事项: 1.调用DLL识别库识别,多线程下不需要加许可证,支持并发识别. 2.调用DLL识别,识别参数设置命令SetWmOption必须与你弄字库时候的设置参数一样,不然会导致识别率下降具体参数说明,请看调用例子里的[我的函数.txt]文档有对应参数说明. 3.如果遇见本工具无法识别的验证码,可以找群主(用神经网络识别)定制,价格便宜公道. [2017-07-27] 完美验证码识别系统V3.2 1.增加DLL识别返回方式2和3具体看我的函数.txt里说明,主要是增加一个可以返回识别后的总体信任度.这个值你可以给它个阀值,比如说如果总体信任度小于60,那么你就不提交服务器,直接重新获取图片识别,直到总体信任度大于60你才提交给服务器,这个阀值具体多少,自己可以先测试. 2.修复导出字库没有导出完,直接关闭窗口崩溃问题 3.添加批量下载后定位到批量下载文件夹 4.增加可以使用验证码长度进行过滤,增加可以使用总体信任度进行过滤.(这两个功能可以快速的制作字库,比如说你验证码是4位的,你可以设置验证码小于4,大于4那这张图片肯定是识别错误的,那么软件就会把这张图片保存下来,同理可以使用总体信任度进行此保存) [2017-07-20] 完美验证码识别系统V3.1 1.修复数组下标越界问题 2.字库列表添加可以多选然后右键批量删除选中项 [2017-07-13] 完美验证码识别系统V3.0 1.修复导出字库,重复导出不会覆盖原来的BUG,导出的图片会累加上去(注意,以前导出的字模导入新版中会出错,新版字模导出格式为a_md5.bmp 请自行写个软件修改文件名,然后再导入) 2.修复添加字库空格都可以添加进去 3.修复崩溃问题.(崩溃应该绝大多数都是此原因造成的.) 4.其它一些调整. [2017-06-25] 完美验证码识别系统V2.6 1.解决输入焦点问题. 2.批量下载增加可以过滤掉宽度范围,面积范围,高度范围,黑色数范围,可以去掉没有用的干扰图片. 3.其它的一些细节调整 [2017-06-07] 完美验证码识别系统V2.5 1.修复去除干扰滤镜在没有先二值化图片都可以使用. 2.尝试解决添加字库崩溃问题(代码较多,找到1处问题.不知道还有没有其他问题) 3.编辑字库页面增加个选中框[添加字库后自动下载图片],使用批量下载图片,可以快速添加字库 4.使用截图工具,截取图片后,会自动切换到划线工具. [2017-05-17] 完美验证码识别系统V2.3 1.修复设置滤镜默认都有选择项. 2.修复当使用本地图像时,没有新建项目都可以编辑的问题. 3.修复黑白处理滤镜在没有先二值化图片都可以使用. 4.修复处理很多逻辑错误会导致程序崩溃. 5.增加字库列表添加右键删除当前选中的字库 6.增加禁止重复运行,由于重复运行会导致字库添加失败,和读取不到已经做过的字库. 7.增加快捷键"自动分割(Alt+R)" ,"手动分割(Alt+T)" 8.编辑页面增加个批量下载按钮,可以实现批量下载并自动分割图片功能(批量下载的图片保存在当前项目文件夹下的"批量下载"文件夹中) 9.主窗口增加一个选择框_图像已处理不使用滤镜,由于批量下载后图片都是已经使用过滤镜了,处理批量下载的图片这里必须得勾选上,不然会重复运用滤镜 [2017-05-07] 完美验证码识别系统V2.2 1.新增分辨率1024*768布局 2.修改注册热键方式为本进程方式(原为全局热键,感谢群友XGSoft提供源代码) [2017-05-06] 完美验证码识别系统V2.1(要求屏幕分辨率最低1440*900) 1.去掉窗口最大化,去掉自动调整窗口大小代码,修复部分控件显示不全 2.增加检测图像是否二值化,没二值化的图片不允许编辑 3.尝试解决添加字库崩溃的问题(不确定问题出在哪!!) 4.解决滤波数组越界问题.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值