运用Struts2.0实现页面中的验证码
来源:互联网 发布:黑马程序员安卓视频 编辑:程序博客网 时间:2024/06/05 07:35
<1>画验证码核心类ValidateCodeAction
package com.tarena.common.action;import java.awt.*;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.util.Random;import javax.imageio.ImageIO;import javax.imageio.stream.ImageOutputStream;import com.opensymphony.xwork2.ActionContext;/** * 网页中验证码的实现 * @author JimmyZhang * @since 2012.5.10 * */public class ValidateCodeAction {private ByteArrayInputStream inputStream;//默认的执行方法public String execute() throws Exception{Random r = new Random();//BufferedImage相当与缓存在内存中的图像BufferedImage image = new BufferedImage(60,//绘图区域的长度 20,//绘图区域的高度 BufferedImage.TYPE_INT_RGB);//获取绘图工具GraphiscsGraphics g = image.getGraphics();//设置绘图颜色g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));//从原点(0,0)填充绘图区域g.fillRect(0, 0, 60, 20);//生成一个随机的字符串(5位数字)String number = String.valueOf(r.nextInt(99999));//将number绘制在image中g.setColor(new Color(0,0,0));g.drawString(number, 5, 15);//将number保存在Session中ActionContext ac = ActionContext.getContext();ac.getSession().put("vcode", number);//画干扰线for(int i=0; i<3;i++){drawLine(g,r);}//写入到字节输出流中 ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageOutputStream imageOutput = ImageIO.createImageOutputStream(output); //将图像image写入到imageOutput中 ImageIO.write(image, "jpeg", imageOutput); //根据output构建inputStream inputStream = new ByteArrayInputStream( output.toByteArray()); //对象之间的转换--image-->ByteArrayOutStream-->ByteArrayInputStream return "success"; }//辅助方法,用于绘制一条干扰线private void drawLine(Graphics g,Random r){g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));//drawLine(x1,y1,x2,y2)g.drawLine( r.nextInt(60), r.nextInt(20), r.nextInt(60), r.nextInt(20));}public ByteArrayInputStream getInputStream() {return inputStream;}public void setInputStream(ByteArrayInputStream inputStream) {this.inputStream = inputStream;}}
<2>Struts2.0注册RegisterAction中验证码的逻辑实现
package com.tarena.dang.user.action;import java.io.*;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionContext;import com.tarena.dang.domain.User;import com.tarena.dang.user.service.UserService;import com.tarena.dang.user.service.UserServiceImpl;/** * 注册页面的Action控制器业务实现 * @author JimmyZhang * */public class RegisterAction {private UserService userService;//使用实体对象简化与表单元素对应关系private User user;private String vcode;//定义与文件域upload赌赢的属性private File upload;//上传文件private String uploadFileName;//上传文件的文件名private String uploadContentType;//上传文件类型public String getVcode() {return vcode;}public void setVcode(String vcode) {this.vcode = vcode;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public RegisterAction(){userService = new UserServiceImpl();System.out.println("【RegisterAction】调用默认无参构造方法");}public String execute() throws Exception{//判断用户输入的验证与session中是否一直一致ActionContext ac = ActionContext.getContext();String session_vocode = (String)ac.getSession().get("vcode");if(!vcode.equals(session_vocode)){ac.put("vcode_info", "<img src='/dang/images/wrong.gif'/>验证码不匹配");return "input";}boolean isSuccess = userService.register(user);if(isSuccess){//上传头像,File upload-->/images/user/userName.jpg//得到服务器端的物理路径String path = ServletActionContext.getServletContext().getRealPath("/images/user/"+user.getUserName()+".jpg");//创建服务器端文件的File对象File dest = new File(path);//upload-->destInputStream fis = new FileInputStream(upload);OutputStream fos = new FileOutputStream(dest);byte[] b = new byte[1024];int n;while((n=fis.read(b,0,b.length))!=-1){fos.write(b,0,n);}fos.close();fis.close();//注册成功ac.put("user", user);return "ok";}else{return "input";}}public File getUpload() {return upload;}public void setUpload(File upload) {this.upload = upload;}public String getUploadFileName() {return uploadFileName;}public void setUploadFileName(String uploadFileName) {this.uploadFileName = uploadFileName;}public String getUploadContentType() {return uploadContentType;}public void setUploadContentType(String uploadContentType) {this.uploadContentType = uploadContentType;}}
<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"><title>用户注册</title><link type="text/css" rel="stylesheet" href="/dang/css/user.css"/><script charset="gbk" type="text/javascript" src="/dang/js/jquery-1.4.1.js"></script><script charset="gbk" type="text/javascript" src="/dang/js/jquery.validate.js"></script><script type="text/javascript">//跟换验证码function changVcode(){//获取图像对象的元素对象var idVcode = document.getElementById("idVcode");//改变其属性idVcode.src="/dang/vcode.action?d="+new Date().getTime();}</script><script type="text/javascript"> $(function(){ //表单验证 $('#registerForm').validate({ rules:{ 'user.userName':{required:true}, 'user.nickname':{required:true,minlength:4,maxlength:20}, 'user.userPassword':{required:true,minlength:6,maxlength:20}, passwordAgain:{required:true,equalTo:'#txtPassword'}, 'user.email':{required:true,email:true}, vcode:{required:true} }, messages:{ 'user.userName':{required:"<img src='/dang/images/wrong.gif'/>用户名不能为空"}, 'user.nickname':{required:"<img src='/dang/images/wrong.gif'/>昵称不能为空", minlength:"<img src='/dang/images/wrong.gif'/>昵称的长度不能少于{0}位", maxlength:"<img src='/dang/images/wrong.gif'/>昵称的长度不能大于{0}位"}, 'user.userPassword':{required:"<img src='/dang/images/wrong.gif'/>密码不能为空", minlength:"<img src='/dang/images/wrong.gif'/>密码的长度不能少于{0}位", maxlength:"<img src='/dang/images/wrong.gif'/>密码的长度不能大于{0}位"}, passwordAgain:{required:"<img src='/dang/images/wrong.gif'/>确认密码不能为空", equalTo:"<img src='/dang/images/wrong.gif'/>确认密码和密码不相等"}, 'user.email':{required:"<img src='/dang/images/wrong.gif'/>Email地址不能为空", email:"<img src='/dang/images/wrong.gif'/>Email地址格式无效"}, vcode:{required:"<img src='/dang/images/wrong.gif'/>验证码不能为空"} }, errorPlacement:function(error,element){ error.appendTo( element.parent().next().find("span").eq(0)); } }); });</script></head><body><div class="container"> <!-- header begin --> <div class="header"> <a href="http://localhost:8080/dang"> <img border="0" alt="我的当当网" src="/dang/images/logo_20110808.png"/> </a> </div> <!-- header end --> <!-- middle begin --> <div class="middle register"> <h1>欢迎注册我的当当网!</h1> <div> <span class="error"></span> <form id="registerForm" name="registerForm" enctype="multipart/form-data" action="/dang/user/register.action" method="post"> <table> <tr><td class="c1">请输入您的用户名:</td> <td class="c2"> <input id="userName" name="user.userName"/> </td> <td class="c3"> <span id="userNameInfo" class="info"></span> </td></tr> <!-- 文件域开始 --> <tr><td class="c1">上传头像</td> <td class="c2"><input type="file" name="upload"></td> </tr> <tr><td class="c3"></td></tr> <!-- 文件域开始 --> <tr><td class="c1">设置您的昵称:</td> <td class="c2"><input name="user.nickname"/></td> <td class="c3"> <span class="tip">您的昵称由英文字母、数字、中文组成,长度为4-20个字符<br/></span> </td></tr> <tr><td class="c1">设置密码:</td> <td class="c2"><input id="txtPassword" type="password" name="user.userPassword"/></td> <td class="c3"><span class="tip">你的密码由英文字母、数字组成,长度6-20位<br/></span></td></tr> <tr><td class="c1">再次输入您设置的密码:</td> <td class="c2"><input type="password" name="passwordAgain"/></td> <td class="c3"> <span class="tip"></span> </td></tr> <tr><td class="c1">请填写您的Email地址:</td> <td class="c2"><input name="user.email"/></td> <td class="c3"><span class="tip"></span></td></tr> <tr><td class="c1">验证码:</td> <td class="c2"> <input name="vcode" style="width:96px;"/> <img id="idVcode" alt="验证码" src="/dang/vcode.action" align="bottom" style="height:20px;"/> </td> <td class="c3"> <span class="tip">请输入图片中文字 <a id="idRefresh" href="#" onclick="changVcode()">看不清,再换一张</a> <br/> <font color="red">${vcode_info}</font> </span> </td></tr> </table> <div> <input id="btn_register" type="image" class="btn_register" alt="" src="/dang/images/register.jpg"/> </div> </form> </div> </div> <!-- middle end --> <!-- footer begin --> <div class="footer"> Copyright © dangdang v2.0, 2011-2012, All Rights Reserved | 京ICP证08000853号 北京达内科技有限公司 <br/> <img alt="" src="/dang/images/validate.gif"/> <img alt="" src="/dang/images/knetSealLogo.png"/> </div> <!-- footer end --></div></body></html>
打完收工,可以直接将源码导入工程中测试,还等什么,实现一下
- 运用Struts2.0实现页面中的验证码
- 运用struts2制作登陆页面的验证(一)
- 运用Struts2数据验证实现注册表单验证
- struts2实现验证码
- Struts2实现验证码
- struts2验证码实现
- Struts2中的ModelDriven运用
- 使用iframe实现,点击JSP页面中的验证码刷新
- Struts2中实现验证码
- struts2 实现图片验证码
- struts2 实现图片验证码
- 登陆验证码(struts2实现)
- Struts2 实现验证码 登陆
- 登陆验证码(struts2实现)
- struts2验证码登陆实现
- struts2实现验证码登陆
- Struts2实现验证码功能
- Ajax+Struts2实现验证码验证功能
- 游戏程序员的学习资料
- RedHat Linux 5 DNS服务器配置详解
- Android ApiDemos示例解析(2): SimpleAdapter,ListActivity,PackageManager
- java线程同步
- 常见端口号
- 运用Struts2.0实现页面中的验证码
- 自定义TabHost实现背景图片随选项卡切换滑动效果
- HTTP 返回状态值
- 黑马程序员——正则表达式
- ubuntu没有权限(不能)创建文件夹(目录)
- 从一次换机器的过程谈软硬件的分离
- GIT分支管理是一门艺术
- nfs(2)
- WebLogic数据源/连接池配置中的一些参数/属性的意义