<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %> <%! 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.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.fillRect(0, 0, width, height); //设定字体 g.setFont(new Font("Times New Roman",Font.PLAIN,18)); //画边框 //g.setColor(new Color()); //g.drawRect(0,0,width-1,height-1); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(getRandColor(160,200)); for (int i=0;i<300;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 i=0;i<4;i++){ String rand=String.valueOf(random.nextInt(10)); sRand+=rand; // 将认证码显示到图象中 g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand,13*i+6,16); } // 将认证码存入SESSION session.setAttribute("rand",sRand); System.out.println("---:"+sRand); //sRand就是随机数 验证码 ,把它放到session中,然后合成到图片中 // 图象生效 g.dispose(); //out.clear(); request.setAttribute("gzip", "false"); // 输出图象到页面 ImageIO.write(image, "JPEG", response.getOutputStream()); out.clear(); out = pageContext.pushBody();
%> <a href="c.jsp">c.jsp</a> <br> <br> <img src="a.jsp"/> <iframe. src="c.jsp"/> |
在iframe中放入的c.jsp页面就是 获取验证码的页面。 这儿加了一个c.jsp 页面链接,主要是用在loadrunner录制脚本的时候,a.jsp 和c.jsp在B页面上加载的顺序不是有序的,因而C.JSP可能获取到的验证码为NULL。 c.jsp Q<%=session.getAttribute("rand")%>Q 在C.JSP页面上 在取得的验证码前后加上两个Q主要为了loadrunner能够捕获到这个验证码做的标记。 下面我们看一下 loadrunner脚本: Action() { web_set_max_html_param_len("1024"); web_url("b.jsp", "URL=http://10.10.129.99:8080/blank/b.jsp", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t1.inf", "Mode=HTTP", LAST); web_concurrent_start(NULL); web_url("a.jsp", "URL=http://10.10.129.99:8080/blank/a.jsp", "Resource=1", "RecContentType=image/jpeg", "Referer=http://10.10.129.99:8080/blank/b.jsp", LAST); /* web_url("c.jsp", "URL=http://10.10.129.99:8080/blank/c.jsp", "Resource=0", "RecContentType=text/html", "Referer=http://10.10.129.99:8080/blank/b.jsp", "Snapshot=t2.inf", "Mode=HTTP", LAST); */ web_concurrent_end(NULL); //获取C.JSP页面上的验证码 web_reg_save_param("aaa", "LB/IC=Q", "RB/IC=Q", "Ord=1", "Search=body", LAST); web_url("c.jsp_2", "URL=http://10.10.129.99:8080/blank/c.jsp", "Resource=0", "RecContentType=text/html", "Referer=http://10.10.129.99:8080/blank/b.jsp", "Snapshot=t3.inf", "Mode=HTTP", LAST); //打印出来 也可以通过loadrunner log日志设置查看 param lr_log_message("-------:%s", lr_eval_string("{aaa}")); return 0; } |
运行结果
运行的时候 要把loadrunner的浏览器给关掉,否则lr的浏览器显示一下,相当于也做了一次请求。 |