运用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>

 

打完收工,可以直接将源码导入工程中测试,还等什么,实现一下