验证码解决办法

2011-05-06  张林 

LR验证码解决办法
http://www.51testing.com/?uid-322941-action-viewspace-itemid-213378
http://www.51testing.com/?uid-322466-action-viewspace-itemid-216626
http://testingtop.com/space.php?uid=174&do=blog&id=734
LoadRunner关于验证码的解决方案[转]现在好多网站系统为了防范,恶意访问系统,在登陆口进行限制,使用验证码登陆。

  验证码是随机产生的,并且验证码在页面上显示为图片。此时想通过loadrunner直接获取服务器发送过来的参数,肯定是不可行的。

  在进行性能测试的时候,有两种办法进行此类系统的测试。

  1、将验证码暂时屏蔽,待完成性能测试后,在恢复。验证码屏蔽一定不会给性能测试带来影响,这是肯定的。

  2、如果要测试系统是在用的系统,屏蔽验证码会带来不安全因素,不能屏蔽验证码。遇到这个问题当然也有办法解决--添加一个页面将验证码的输出到页面,然后用loadrunner获取到。

  JSP为例:

  验证码页面(a.jsp

<%@ 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();

%>

将验证码jsp页面作为图片放到b.jsp页面中:

<a href="c.jsp">c.jsp





<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能够捕获到这个验证码做的标记。

        "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的浏览器显示一下,相当于也做了一次请求。


437°/4373 人阅读/0 条评论 发表评论

登录 后发表评论