Jsp   发布时间:2019-10-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了图片校验码的生成大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

进入首页,会显示一个彩色图形验证码,用户根据图片上的文字输入文本框。

ject" align="center">

title="图片校验码的生成" alt="图片校验码的生成" src="https://cn.js-code.com/res/2019/03-21/12/316338f3253e6ea7d545605be0ce1981.png" align="middle">

如果输入错误,会提示输入与图片文字不同,并更新验证码。

ject" align="center">

title="图片校验码的生成" alt="图片校验码的生成" src="https://cn.js-code.com/res/2019/03-21/12/41c116a099264a24db0ad9681ce15cfd.png" align="middle">

输入正确会显示成功信息。

ject" align="center">

title="图片校验码的生成" alt="图片校验码的生成" src="https://cn.js-code.com/res/2019/03-21/12/2484f5de9407386ddafffd16e863dd40.png" align="middle">

彩色验证码用来防止恶意程序自动发送垃圾消息,或者是恶意程序循环尝试登录密码。人眼可以根据图片了解验证码的内容,但如果是程序就需要扫描图片分析图片中的内容,为了加大程序分析破解的难度,我们还为图片准备了干扰用的背景颜色,并随便修改文字的颜色。这些都是为了加大程序破解的难度。

现在所有的注意力都集中到如何动态生成校验用的图片,看一下index.jsp中的代码。

大家可能感到奇怪了,这里img标签对应的是一个静态jpg图片,为什么每次刷新显示的图片内容都不同呢?仔细检查12-01目录下我们也看不到captcha.jpg这个图片,这个图片到底是从哪里得到的呢?在html里包含的图片,css样式表,js脚本,视频等等外部资源,都需要浏览器再次向服务器发起请求。现在我们进行的请求是一个名叫captcha.jpg的图片,而服务器上并没有这个图片,从web.xml里的配置可以看到如下配置。

CaptchaServlet >Anni.CaptchaServlet> CaptchaServlet /captcha.jpg
httpServletrequest request,httpServletResponse responsE) {
</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;设置页面不缓存</span>
response.setHeader("Pragma","No-cache"<span style="color: #000000;"&gt;);
response.setHeader(</span>"Cache-Control","no-cache"<span style="color: #000000;"&gt;);
response.setDateHeader(</span>"Expires",0<span style="color: #000000;"&gt;);

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 在内存中创建图象</span>
<span style="color: #0000ff;"&gt;int</span> width = 60,height = 20<span style="color: #000000;"&gt;;
BufferedImage image </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 获取图形上下文</span>
Graphics g =<span style="color: #000000;"&gt; image.getGraphics();

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;生成随机类</span>
Random random = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Random();

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 设定背景色</span>
g.setColor(getRandColor(200,250<span style="color: #000000;"&gt;));
g.fillRect(</span>0,0<span style="color: #000000;"&gt;,width,height);

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;设定字体</span>
g.setFont(<span style="color: #0000ff;"&gt;new</span> Font("Times New Roman",Font.PLAIN,18<span style="color: #000000;"&gt;));

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;画边框
</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;g.setColor(new Color());
</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;g.drawRect(0,width - 1,height - 1);


</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到</span>
g.setColor(getRandColor(160,200<span style="color: #000000;"&gt;));
</span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = 0; i < 155; i++<span style="color: #000000;"&gt;) {
    </span><span style="color: #0000ff;"&gt;int</span> x =<span style="color: #000000;"&gt; random.nexTint(width);
    </span><span style="color: #0000ff;"&gt;int</span> y =<span style="color: #000000;"&gt; random.nexTint(height);
    </span><span style="color: #0000ff;"&gt;int</span> xl = random.nexTint(12<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;int</span> yl = random.nexTint(12<span style="color: #000000;"&gt;);
    g.drawLine(x,y,x</span>+xl,y+<span style="color: #000000;"&gt;yl);
}

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 取随机产生的认证码(4位数字)</span>
String sRand = ""<span style="color: #000000;"&gt;;
</span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = 0;i < 4; i++<span style="color: #000000;"&gt;) {
    String rand </span>= String.valueOf(random.nexTint(10<span style="color: #000000;"&gt;));
    sRand </span>+=<span style="color: #000000;"&gt; rand;
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 将认证码显示到图象中
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成</span>
    g.setColor(<span style="color: #0000ff;"&gt;new</span> Color(20 + random.nexTint(110),20 + random.nexTint(110),20 + random.nexTint(110<span style="color: #000000;"&gt;)));
    g.drawString(rand,</span>13 * i + 6,16<span style="color: #000000;"&gt;);
}

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 将认证码存入SESSION</span>
request.getSession().setAttribute("captcha"<span style="color: #000000;"&gt;,sRand);

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 图象生效</span>

<span style="color: #000000;"> g.dispose();

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 输出图象到页面</span>
ImageIO.write(image,"JPEG"<span style="color: #000000;"&gt;,response.getOutputStream());

}

代码最先设置response(响应)中的头部配置,告诉浏览器不要缓存对/captcha.jpg的请求结果,这样才能保证每次刷新页面都看到最新生成的图片,要是设置了缓存很可能每次看到的都是最先请求看到的图片。

中间一大段代码实现动态生成图片的功能,我们先随机获得几个数字,然后写到BufferedImage中,最后就可以把图片数据写到response,因为图片是二进制数据,所以我们使用了response.getOutputStream()而不是response.getWriter()。

为了达到验证的功能,每次生成图片之后要记得讲随机得到的数字保存到session中,session中的变量可以跨越多个请求周期存在,等用户输入验证码提交后就能与session中的数据做比较了,这些是在checkServlet中实现的。、

 

dopost(httpServletrequest request,IOException {
httpSession session </span>=<span style="color: #000000;"&gt; request.getSession();

String requestCaptcha </span>= request.getParameter("captcha"<span style="color: #000000;"&gt;);
String sessionCaptcha </span>= (String) session.getAttribute("captcha"<span style="color: #000000;"&gt;);

</span><span style="color: #0000ff;"&gt;if</span> (sessionCaptcha != <span style="color: #0000ff;"&gt;null</span> &amp;&amp;<span style="color: #000000;"&gt; sessionCaptcha.equals(requestCaptcha)) {
    session.removeAttribute(</span>"captcha"<span style="color: #000000;"&gt;);
    request.getrequestDispatcher(</span>"/success.jsp"<span style="color: #000000;"&gt;).forWARD(request,responsE);
} </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
    request.setAttribute(</span>"message","验证码输入错误"<span style="color: #000000;"&gt;);
    request.getrequestDispatcher(</span>"/index.jsp"<span style="color: #000000;"&gt;).forWARD(request,responsE);
}

}

 

大佬总结

以上是大佬教程为你收集整理的图片校验码的生成全部内容,希望文章能够帮你解决图片校验码的生成所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: