验证码相关
SERVLET
package com.neowave.health.web; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.*; import java.awt.*; import java.awt.image.*; import java.util.*; import javax.imageio.*; public class AuthImg extends HttpServlet { //定义图形验证码中绘制字符的字体 private final Font mFont = new Font("Arial Black", Font.PLAIN, 16); //定义图形验证码的大小 private final int IMG_WIDTH = 100; private final int IMG_HEIGTH = 18; //定义一个获取随机颜色的方法 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); } //重写service方法,生成对客户端的响应 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置禁止缓存 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); BufferedImage image = new BufferedImage (IMG_WIDTH , IMG_HEIGTH , BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(getRandColor(200 , 250)); //填充背景色 g.fillRect(1, 1, IMG_WIDTH - 1, IMG_HEIGTH - 1); //为图形验证码绘制边框 g.setColor(new Color(102 , 102 , 102)); g.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGTH - 1); g.setColor(getRandColor(160,200)); //生成随机干扰线 for (int i = 0 ; i < 80 ; i++) { int x = random.nextInt(IMG_WIDTH - 1); int y = random.nextInt(IMG_HEIGTH - 1); int xl = random.nextInt(6) + 1; int yl = random.nextInt(12) + 1; g.drawLine(x , y , x + xl , y + yl); } g.setColor(getRandColor(160,200)); //生成随机干扰线 for (int i = 0 ; i < 80 ; i++) { int x = random.nextInt(IMG_WIDTH - 1); int y = random.nextInt(IMG_HEIGTH - 1); int xl = random.nextInt(12) + 1; int yl = random.nextInt(6) + 1; g.drawLine(x , y , x - xl , y - yl); } //设置绘制字符的字体 g.setFont(mFont); //用于保存系统生成的随机字符串 String sRand = ""; for (int i = 0 ; i < 6 ; i++) { String tmp = getRandomChar(); sRand += tmp; //获取随机颜色 g.setColor(new Color(20 + random.nextInt(110) ,20 + random.nextInt(110) ,20 + random.nextInt(110))); //在图片上绘制系统生成的随机字符 g.drawString(tmp , 15 * i + 10,15); } //获取HttpSesssion对象 HttpSession session = request.getSession(true); //将随机字符串放入HttpSesssion对象中 session.setAttribute("rand" , sRand); g.dispose(); //向输出流中输出图片 ImageIO.write(image, "JPEG", response.getOutputStream()); } //定义获取随机字符串方法 private String getRandomChar() { //生成一个0、1、2的随机数字 int rand = (int)Math.round(Math.random() * 2); long itmp = 0; char ctmp = '\u0000'; switch (rand) { //生成大写字母 case 1: itmp = Math.round(Math.random() * 25 + 65); ctmp = (char)itmp; return String.valueOf(ctmp); //生成小写字母 case 2: itmp = Math.round(Math.random() * 25 + 97); ctmp = (char)itmp; return String.valueOf(ctmp); //生成数字 default : itmp = Math.round(Math.random() * 9); return itmp + ""; } } }
servlet配置:
<servlet> <servlet-name>AuthImg</servlet-name> <servlet-class>com.neowave.health.web.AuthImg</servlet-class> </servlet> <servlet-mapping> <servlet-name>AuthImg</servlet-name> <url-pattern>/authImg</url-pattern> </servlet-mapping>
图片导入:
<div> <input type="text" name="vercode" ></input><span ></span> <br> 验证码:<img name="d" src="/neowave_health/authImg" > </div>
刷新JS:
function refresh(el) { el.src="/neowave_health/authImg?" + Math.random(); }
登陆处理:
package com.neowave.health.action; import java.util.List; import javax.annotation.Resource; import org.apache.log4j.Logger; import com.hansci.base.action.BaseAction; import com.neowave.health.entity.NeowaveFamily; import com.neowave.health.entity.NeowaveUser; import com.neowave.health.service.HealthFamilyService; import com.neowave.health.service.HealthUserService; import com.neowave.health.util.WebConstant; import com.opensymphony.xwork2.ActionContext; import static com.neowave.health.util.CipherUtil.*; /** * @author zhuzhengke * */ public class LoginAction extends BaseAction { private static final long serialVersionUID = 8372896842000249263L; @Resource private HealthFamilyService healthFamilyService; @Resource private HealthUserService healthUserService; private List<NeowaveUser> neowaveUsers; //登录的验证码 private String vercode; private String username; private String password; private NeowaveFamily family; private Logger log = Logger.getLogger(LoginAction.class); public String execute() { //创建ActionContext实例 ActionContext ctx = ActionContext.getContext(); //获取HttpSession中的rand属性 String ver2 = (String)ctx.getSession().get("rand"); log.info("验证码是:"+ver2); log.info("输入的验证码是:"+vercode); log.info("password="+password); password = generatePassword(password); log.info("MD5之后的密码是:"+generatePassword(password)); //System.out.println("---------------"+healthUserService.isValidate("zzk", "123")); log.info("username="+username); log.info("password="+password); family = healthFamilyService.get("familyName", username); log.info("---------"+family.getFamilyPassword()+"-----------"+family.getFamilyName()); if(vercode.equalsIgnoreCase(ver2)) { if(null!=family.getFamilyPassword() && family.getFamilyPassword().equalsIgnoreCase(password)) { //将当前用户的ID放到session中 ctx.getSession().put(WebConstant.FAMILY_ID, family.getFamilyID()); log.info("---------------"+ctx.getSession().get(WebConstant.FAMILY_ID)); neowaveUsers = healthUserService.getList("healthFamily.familyID", ctx.getSession().get(WebConstant.FAMILY_ID)); log.info("---------------"+family.getNeowaveUsers().size()); return LIST; } else { return ERROR; } } else { return ERROR; } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List<NeowaveUser> getNeowaveUsers() { return neowaveUsers; } public void setNeowaveUsers(List<NeowaveUser> neowaveUsers) { this.neowaveUsers = neowaveUsers; } //vercode属性的setter和getter方法 public void setVercode(String vercode) { this.vercode = vercode; } public String getVercode() { return this.vercode; } }
最后更新:2017-04-03 16:59:48