后台验证码生成

后台验证码生成

目录:

1、验证码的工作原理:

2、Graphics类:

3、源代码:

4、运行结果:


1、验证码的工作原理:

答:(1)服务器端生成验证码——发送给客户端用户——在客户端显示——用户根据显示输入验证码——提交数据信息——服务器端进行对比验证——正确则通过验证,不正确则不通过验证

(2)验证码就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰元素,由用户肉眼识别其中的验证码信息,然后输入表单提交网站验证,验证成功后才能使用某项功能。

 

2、Graphics类:

答:(1)Graphics类是所有图形上下文的抽象基类,允许应用程序在组件以及闭屏图像上进行绘制。

(2)常用方法:

①drawImage(Image img, int x, int y, ImageObserver observer) :绘制指定图像中当前可用的图像。

②drawString(String str, int x, int y) :使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。

③setFont(Font font) :将此图形上下文的字体设置为指定字体。

④setColor(Color c):将此图形上下文的当前颜色设置为指定颜色。

⑤fillRect(int x, int y, int width, int height):填充指定的矩形。

x:要填充矩形的 x 坐标。

y:要填充矩形的 y 坐标。

width:要填充矩形的宽度。

height:要填充矩形的高度。

⑥drawLine(int x1, int y1, int x2, int y2) :在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。

x1:第一个点的 x 坐标。

y1:第一个点的 y 坐标。

x2:第二个点的 x 坐标。

y2:第二个点的 y 坐标。

⑦dispose() :释放此图形的上下文以及它使用的所有系统资源。


3、源代码:

①CodeService.java接口

package com.remoa.code.service;

public interface CodeService {
	public void changeYanzhengma()throws Throwable;//改变验证码
	public String gainYanzhengma()throws Throwable;//获得验证码
}
②CodeServiceImp.java
package com.remoa.code.service;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;

import org.springframework.stereotype.Service;
@Service
public class CodeServiceImp implements CodeService{
	private String yanzhengma;
	
	public String getYanzhengma() {
		return yanzhengma;
	}

	public void setYanzhengma(String yanzhengma) {
		this.yanzhengma = yanzhengma;
	}

	@Override
	public void changeYanzhengma() throws Throwable {
		int width = 80;//宽
		int height = 40;//高
		int linesNumber = 8;//干扰线数量
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics graphics = image.getGraphics();
		//设置背景色为白色
		graphics.setColor(Color.WHITE);
		//设置一个宽为80px,高为40px的矩形框
		graphics.fillRect(0, 0, width, height);
		//设置字体为Arial,加粗,20px的大小
		graphics.setFont(new Font("Arial", Font.BOLD, 20));
		Date d = new Date();
		System.out.println("时间为: " + d.getTime());
		Random r = new Random(d.getTime());
		//设置验证码内容
		String base = "QWERTYUIOPLKJHGFDSAZXCVBNM1234567890";
		System.out.print("验证码为:");
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i < 4; i++){
			int number = r.nextInt(base.length());
			int y = 15 + r.nextInt(20);
			Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
			graphics.setColor(c);
			String s = String.valueOf(base.charAt(number));
			graphics.drawString(s, 5 + i * width / 4, y);
			sb.append(s);
		}
		this.setYanzhengma(sb.toString());
		System.out.println(this.getYanzhengma());
		System.out.println("颜色:" + graphics.getColor() + ", \n字体:" + graphics.getFont());
		//设置干扰线
		for(int i = 0; i < linesNumber; i++){
			Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
			graphics.setColor(c);
			graphics.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
		}
		graphics.dispose();
		ImageIO.write(image, "JPG", new FileOutputStream(new File("D:/apps/yanzhengma.jpg")));
	}

	@Override
	public String gainYanzhengma() throws Throwable {
		return this.getYanzhengma();
	}
}
③UserAction.java
package com.remoa.user.action;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.remoa.code.service.CodeService;
import com.remoa.user.domain.UserVO;
import com.remoa.user.domain.UserValidate;
import com.remoa.user.service.UserService;

@Controller
@RequestMapping("/user")
public class UserAction {
	@Autowired
	private UserService service;
	private UserVO user = new UserVO();
	@Autowired
	private CodeService codeService;
	private String yanzhengma;
	
	public UserService getService() {
		return service;
	}

	public void setService(UserService service) {
		this.service = service;
	}

	public UserVO getUser() {
		return user;
	}

	public void setUser(UserVO user) {
		this.user = user;
	}

	public String getYanzhengma() {
		return yanzhengma;
	}

	public void setYanzhengma(String yanzhengma) {
		this.yanzhengma = yanzhengma;
	}

	public CodeService getCodeService() {
		return codeService;
	}

	public void setCodeService(CodeService codeService) {
		this.codeService = codeService;
	}

	@RequestMapping("toregister.action")
	public String toRegister(){
		return "redirect:/user/changeyzm.action";
	}
	
	@RequestMapping(value="doregister.action", method=RequestMethod.POST)
	public String register(@Valid @ModelAttribute("registerModel") UserValidate validate, BindingResult result, Model model, HttpSession session)throws Throwable{
		System.out.println("----------------进入到完成注册操作的doregister.action了------------");
		model.addAttribute("validate", validate);
		if(result.hasErrors()){
			return "user/register";
		}else{
			String password = validate.getUserpassword();
			String checkPassword = validate.getCheckpassword();
			if(password.equals(checkPassword)){
				user.setUserpassword(password);
				model.addAttribute("passwordNotMatch", null);
			}else{
				model.addAttribute("passwordNotMatch", "两次密码输入不匹配");
				return "user/register";
			}
			String yanzhengma = validate.getYanzhengma().toUpperCase();
			String checkYanzhengma = (String)session.getAttribute("checkYanzhengma");
			if(yanzhengma.equals(checkYanzhengma)){
				model.addAttribute("yanzhengmaNotMatch", null);
			}else{
				model.addAttribute("yanzhengmaNotMatch", "验证码输入错误");
				return "user/register";
			}
			user.setUsermail(validate.getUsermail());
			System.out.println(user);
			service.register(user);
			model.addAttribute("validate", null);
			return "redirect:/user/login.action";
		}
	}
	
	@RequestMapping("changeyzm.action")
	public String demo(HttpSession session) throws Throwable{
		codeService.changeYanzhengma();
		this.yanzhengma = codeService.gainYanzhengma();
		System.out.println("--------------进入到代表验证码changeyzm.action了----------" + this.yanzhengma);
		session.setAttribute("checkYanzhengma", this.yanzhengma);
		return "/user/register";
	}
}
④测试页面register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!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">
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<script type="text/javascript" src="${path }/bootstrap/js/jquery.min.js" ></script>
	<script type="text/javascript" src="${path }/bootstrap/js/bootstrap.min.js" ></script>
	<link rel="stylesheet" href="${path }/bootstrap/css/bootstrap.min.css" />
	<title>注册页面</title>
	<style>
		body {
    font-family: "Helvetica Neue", Helvetica, Arial, "Microsoft Yahei UI", "Microsoft YaHei", SimHei, "\5B8B\4F53", simsun, sans-serif;
		}
		.error{
			color:red;
		}
	</style>
</head>
<body>
	<div class="col-md-7" style="text-align:center; font-size:25px">
		新用户注册:
	</div>
	<div class="col-md-7">
		<form:form class="form" action="doregister.action" modelAttribute="registerModel" method="post" role="form" >
			<div class="form-group col-md-12">
				<label for="usermail" class="col-md-2 control-label">
					邮箱:
				</label>
				<div class="col-md-7">
					<input type="text" name="usermail" class="form-control" value="${validate.usermail }" placeholder="请输入邮箱地址" />
				</div>
				<div class="col-md-3">
					<form:errors path="usermail" class="error"></form:errors>
				</div>
			</div>
			<div class="form-group col-md-12">
				<label for="userpassword" class="col-md-2 control-label">
					密码:
				</label>
				<div class="col-md-7">
					<input type="password" name="userpassword" class="form-control" value="${validate.userpassword }" placeholder="设置您的登录密码" />
				</div>
				<div class="col-md-3">
					<form:errors path="userpassword" class="error"></form:errors>
				</div>
			</div>
			<div class="form-group col-md-12">
				<label for="checkpassword" class="col-md-2 control-label">
					密码确认:
				</label>
				<div class="col-md-7">
					<input type="password" name="checkpassword" class="form-control" value="${validate.checkpassword }" placeholder="请再次输入密码" />
				</div>
				<div class="col-md-3">
					<form:errors path="checkpassword" class="error"></form:errors>
				</div>
			</div>
			<div class="form-group col-md-12">
				<label for="yanzhengma" class="col-md-2 control-label">
					验证码:
				</label>
				<div class="col-md-3">
					<input type="text" name="yanzhengma" class="form-control" value="${validate.yanzhengma }" placeholder="请输入验证码">
				</div>
				<div class="col-md-3">
					<img src="/images/yanzhengma.jpg" alt="验证码"/>
					<a href="${path }/user/toregister.action">看不清</a>
				</div>
				<div class="col-md-4">
					<form:errors path="yanzhengma" class="error"></form:errors>
				</div>
			</div>
			<input type="submit" class="btn btn-success col-md-offset-3" value="提交" />
			<input type="reset" class="btn btn-primary col-md-offset-1" value="重置" />
			  <a href="${path }/user/login.action">点此返回登录界面</a>
			<p class="error">${passwordNotMatch }</p>
			<p class="error">${yanzhengmaNotMatch }</p>
		</form:form>
	</div>
</body>
</html>

4、运行结果:
图4.1 运行结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值