SSH登录注册的验证码

相信很多平台的登录注册和验证都有验证码,今天写一个关于四位不同字母+数字的验证码,顺便提一下,验证码感觉不好看,样式可以自己改的

1.action层定义验证码,绘制图片,以及验证码内容,导包导入的是awt的,在checkImg()方法中,return为NONE,所以在struts中不需要配置任何东西,写好action的路径即可

public String checkImg() throws IOException {
		int width = 120;
		int height = 30;
		// 步骤一 绘制一张内存中图片
		BufferedImage bufferedImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
		// 步骤二 图片绘制背景颜色 ---通过绘图对象
		Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
		// 绘制任何图形之前 都必须指定一个颜色
		graphics.setColor(getRandColor(200, 250));
		graphics.fillRect(0, 0, width, height);
		// 步骤三 绘制边框
		graphics.setColor(Color.WHITE);
		graphics.drawRect(0, 0, width - 1, height - 1);
		// 步骤四 四个随机数字
		Graphics2D graphics2d = (Graphics2D) graphics;
		// 设置输出字体
		graphics2d.setFont(new Font("宋体", Font.BOLD, 18));
		String words ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
		Random random = new Random();// 生成随机数
		// 定义StringBuffer 
		StringBuffer sb = new StringBuffer();
		// 定义x坐标
		int x = 10;
		for (int i = 0; i < 4; i++) {
			// 随机颜色
			graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
			// 旋转 -30 --- 30度
			int jiaodu = random.nextInt(60) - 30;
			// 换算弧度
			double theta = jiaodu * Math.PI / 180;
			// 生成一个随机数字
			int index = random.nextInt(words.length()); // 生成随机数 0 到 length - 1
			// 获得字母数字
			char c = words.charAt(index);
			sb.append(c);
			// 将c 输出到图片
			graphics2d.rotate(theta, x, 20);
			graphics2d.drawString(String.valueOf(c), x, 20);
			graphics2d.rotate(-theta, x, 20);
			x += 30;
		}
		// 将生成的字母存入到session中
		ServletActionContext.getRequest().getSession().setAttribute("checkcode", sb.toString());
		// 步骤五 绘制干扰线
		graphics.setColor(getRandColor(160, 200));
		int x1;
		int x2;
		int y1;
		int y2;
		for (int i = 0; i < 30; i++) {
			x1 = random.nextInt(width);
			x2 = random.nextInt(12);
			y1 = random.nextInt(height);
			y2 = random.nextInt(12);
			graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
		}
		// 将上面图片输出到浏览器 ImageIO
		graphics.dispose();// 释放资源
		ImageIO.write(bufferedImage, "jpg", ServletActionContext.getResponse().getOutputStream());
		return NONE;
	}
	/**
	 * 取其某一范围的color
	 * 
	 * @param fc
	 *            int 范围参数1
	 * @param bc
	 *            int 范围参数2
	 * @return Color
	 */
	private 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);
	}

2.前台jsp页面

<div class="form-group">
    <label for="inputPassword3" class="col-sm-2 control-label">验证码</label>
    <div class="col-sm-3">
    <input type="text" class="form-control" id="checkcode" name="checkcode" placeholder="请输入验证码">
    </div>
    <div class="col-sm-3">
        <img id="checkimg" class="captchaImage"    src="${pageContext.request.contextPath}/user_checkImg.action" onclick="change()" title="点击更换验证码"/>
    </div>
</div>
//切换验证码
function change() {
	var img1 = document.getElementById("checkimg");
	img1.src = "${pageContext.request.contextPath}/user_checkImg.action?"+ new Date().getTime(); //加时间戳防止缓存
}

3.判断验证码是否可以有用,登录注册都可以使用

(1)action层代码块

public String login() {
		if (user != null) {
			User result_user = userService.findUserByAccount(user);
			if (result_user != null) {
				//判断验证码程序
				//从Session中获得验证码的随机值  checkcode为前台input的name属性
				String checkcode1 =(String)ServletActionContext.getRequest().getSession().getAttribute("checkcode");
				if(!checkcode.equalsIgnoreCase(checkcode1)){
					this.addActionError("验证码输入错误!");
					return "checkcodeFail";
				}else {
					ActionContext.getContext().getSession().put("user", result_user);
					return "loginSuccess";
				}
			}
		}
		return "loginFail";
	}

(2)接着就是走dao→Service→action这个路线了

a.dao层查询用户账号以及密码,通过继承HibernateDaoSupport来调用getHibernateTemplate()

@Resource
	private void setHibernateTemplate(SessionFactory sessionFactory) {
		// TODO Auto-generated method stub
		this.setSessionFactory(sessionFactory);
	}
	
	public User findUserByAccount(User user) {
		List<User> users = (List<User>) this.getHibernateTemplate().find("from User where username = ? and password = ? and state=1", user.getUsername(),user.getPassword());
		return users.size() == 0 ? null : users.get(0);
	}

b. dao的接口类

public interface IUserDao {
	public User findUserByAccount(User user);
}

c. Service的接口类

public interface IUserService {
	public User findUserByAccount(User user);
}

d.调用接口类的方法

public class UserServiceImpl implements IUserService{

	@Resource
	private IUserDao userDao;
	@Override
	public User findUserByAccount(User user) {
		return userDao.findUserByAccount(user);
	}
	
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值