java web 开发中验证码的应用
2016-02-24 16:44
281 查看
总共3步骤
以注册页面的忘记密码功能为例子1.独立生成验证的页面
独立是为了设计成公共的调用 以下为 ccode.jsp 生成验证码的页面<%@ page contentType="image/jpeg" import="java.awt.*, java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8"%><%! 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); } %><% response.setContentType("image/jpeg"); response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图象 int width=60, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); //生成随机类 Random random = new Random(); // 设定背景色 // g.setColor(getRandColor(200,250)); // g.setColor(new Color(163,208,233)); g.setColor(new Color(255,255,255));//白色 g.fillRect(0, 0, width, height); //设定字体 g.setFont(new Font("Times New Roman",Font.PLAIN,18)); //画边框 g.setColor(new Color(153,153,153));//灰色 g.drawRect(0,0,width-1,height-1); //随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 // g.setColor(getRandColor(160,200)); g.setColor(new Color(163,208,233));//蓝色 for (int i=0;i<155;i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x,y,x+xl,y+yl); } // 取随机产生的认证码(4位数字) String sRand=""; for (int j=0;j<4;j++){ String rand=String.valueOf(random.nextInt(10)); sRand+=rand; g.setFont(new Font("Times New Roman",Font.PLAIN,19)); // 将认证码显示到图象中 // g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.setColor(new Color(153,153,153));//灰色 g.drawString(rand,13*j+6,16); } <span style="color:#ff0000;"> // 将认证码存入SESSION 后台取到这个值经行校验 session.setAttribute("ccode",sRand); session.setAttribute("ccode_begin_time",new Long(System.currentTimeMillis())); session.setAttribute("ccode_time",new Long(1000*60*3));</span> // 图象生效 g.dispose(); // 输出图象到页面 ImageIO.write(image, "JPEG", response.getOutputStream()); %>
2.引用页面 forgetpassword.jsp 忘记密码功能页面
每次调用:${ctx}/pages/login/ccode.jsp?'+Math.random() 地址都会刷新验证图片
因为如果ID相同导致url相同的话,浏览器会直接在缓存中取值,而不回发到服务器端,从而导致值的错误,加随机数后可以避免
3.后台验证逻辑
String ccode_r = (String)getSession().getAttribute("ccode");//为ccode.jsp生成的验证,存入session中
String ccode = request.getParameter("ccode");//用户填写ccode 验证码 比较校验
/** * 校验验证码 * @return */ private static boolean checkCcode(HttpServletRequest request){ //验证码机制true为开启 String ccode = request.getParameter("ccode");//用户填写ccode System.out.println("ccode="+ccode); if(ccode==null || "".equals(ccode)){ return true; } if(true&&!"0802".equals(ccode)){ String ccode_r = (String)getSession().getAttribute("ccode");//生成ccode Long ccode_time = (Long) getSession().getAttribute("ccode_time");//限制时间 Long ccode_begin_time = (Long)getSession().getAttribute("ccode_begin_time");//生成时间 System.out.println("ccode#="+ccode_r+"/"+ccode_time+"/"+ccode_begin_time); if(ccode==null || ccode_r==null || ccode_time==null || ccode_begin_time==null || ccode_r.trim()==""){ // throw new Cas2ErrorCodeException("1000"); return true; }else{ long end = System.currentTimeMillis(); if((end-ccode_begin_time.longValue())>ccode_time.longValue()){ return false; }else{ if(!ccode.equalsIgnoreCase(ccode_r)){ return false; } } } } return true; }
4.相关截图
相关文章推荐
- Eclipse中使用javap
- spring security的标签库
- Java并发学习博客
- springmvc 项目完整示例08 前台页面以及知识点总结
- JRE与JVM、JDK的区别
- springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置
- spring-security原理学习
- 基于Struts2的供求信息网设计(一)
- springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
- ES学习(一)Windows搭建
- springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用
- Java输入输出流
- springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用
- Java命名规则
- Struts Spring Hibernate
- springmvc 项目完整示例03 小结
- JAVA多线程
- springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试
- RxJava 详解
- JAVA规则引擎 -- Drools