后台验证码生成

来源:互联网 发布:淘宝全屏海报怎么设置 编辑:程序博客网 时间:2024/05/20 19:49
后台验证码生成

目录:

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;@Servicepublic class CodeServiceImp implements CodeService{private String yanzhengma;public String getYanzhengma() {return yanzhengma;}public void setYanzhengma(String yanzhengma) {this.yanzhengma = yanzhengma;}@Overridepublic 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")));}@Overridepublic 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 {@Autowiredprivate UserService service;private UserVO user = new UserVO();@Autowiredprivate 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 0