JavaWeb中验证码的实现

  在Web程序中,验证码是经常使用的技术之一。Web程序永远面临未知用户和未知程序的探测。为了防止恶意脚本的执行,验证码技术无疑是首选方案之一。本文将讨论如何在JSP和Servlet中使用验证码技术。

  验证码的产生思路很简单,在Servlet中随机产生验证码字符序列,并计入session中,JSP中以图片的形式进行显示。当用户在JSP表单中输入验证码并提交时,在相应的Servlet中验证是否与session中保存的验证码一致。下面通过代码,一次演示验证码产生和实现的验证的过程。

  1. 验证码的产生

  我们需要创建一个名为ValcodeServlet的servlet并在其doGet()方法中完成验证码的产生。首先通过随机数的产生类Random随机产生一个4位的验证码,并将其存入session;然后使用BufferedImage和Graphics类把验证码转为图片,当然为了起到较好的效果,我们需要添加一些干扰线;最后使用ImageIO将图片输出。详细代码如下:

protectedvoiddoGet(HttpServletRequest request, HttpServletResponse   response) throwsServletException, IOException {

       // 告知浏览当作图片处理

       response.setContentType("image/jpeg");

 

       // 告诉浏览器不缓存

       response.setHeader("pragma", "no-cache");

       response.setHeader("cache-control", "no-cache");

       response.setHeader("expires", "0");

 

       // 产生由4位数字构成的验证码

       int length = 4;

       String valcode   = "";

       Random rd =   new Random();

       for(int i=0;   i<length; i++)

           valcode+=rd.nextInt(10);

 

       // 把产生的验证码存入到Session中

       HttpSession   session = request.getSession();

       session.setAttribute("valcode", valcode);

 

       // 产生图片

       int width = 80;

       int height = 25;

       BufferedImageimg   = newBufferedImage(width, height,BufferedImage.TYPE_INT_RGB);

 

       // 获取一个Graphics

       Graphics g   = img.getGraphics();

 

       // 填充背景色

       g.setColor(Color.WHITE);

       g.fillRect(0,   0, width, height);

 

       // 填充干扰线50

       for(int i=0;   i<50; i++){

           g.setColor(new   Color(rd.nextInt(100)+155,rd.nextInt(100)+155,rd.nextInt(100)+155));

           g.drawLine(rd.nextInt(width),   rd.nextInt(height),rd.nextInt(width), rd.nextInt(height));

       }

 

       // 绘制边框

       g.setColor(Color.GRAY);

       g.drawRect(0,   0, width-1, height-1);

 

       // 绘制验证码

       Font[]   fonts = {new Font("隶书",Font.BOLD,18),new Font("楷体",Font.BOLD,18),new Font("宋体",Font.BOLD,18),new Font("幼圆",Font.BOLD,18)};

       for(int i=0;   i<length; i++){

           g.setColor(new   Color(rd.nextInt(150),rd.nextInt(150),rd.nextInt(150)));

           g.setFont(fonts[rd.nextInt(fonts.length)]);

           g.drawString(valcode.charAt(i)+"", width/valcode.length()*i+2, 18);

       }

 

       // 输出图像

       g.dispose();

       ImageIO.write(img,   "jpeg", response.getOutputStream());

    }

  上面的代码只是产生了一个常规的验证码,我们可以根据自己的需要对验证码的产生策略和干扰线进行调整。Servlet编写完毕,别忘了在web.xml中进行配置以便能在JSP中调用,其代码如下:

<servlet>

<description></description>

<display-name>ValcodeServlet</display-name>

<servlet-name>ValcodeServlet</servlet-name><servlet-class>org.icer.jee.valcode.servlet.ValcodeServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ValcodeServlet</servlet-name>

<url-pattern>/ValcodeServlet</url-pattern>

</servlet-mapping>

 

  2. 验证码的显示

  产生验证码的servlet编写完毕,并且已经web.xml中进行了配置,那么我们在input.jsp中使用<img />标记以图片的方式调用servlet即可显示验证码。
                       

  当然为了能起到验证效果,本例中还包含了简单的表单。为了放置验证码无法识别,此处还提供了看不清点击换一张功能,用户点击图片时重新加载验证码图片(问号是为了放置浏览器缓存而不能实现重新请求图片)。JSP中表单部分代码如下:

<formname="form1"method="post"action="LoginServlet">

验证码:

<inputname="vcode"type="text"class="input02"id="vcode">

<imgsrc="ValcodeServlet"align="absmiddle"title="看不清,点击换一张"onClick="this.src=this.src+'?'"/>

<inputtype="submit"name="button"id="button"value="   提交 ">

</form>

  3. 实现验证功能

  当表单提交到CheckServlet时,对用户填写的验证码和session中存储的验证码进行比对,根据结果给出不同提示。代码如下:

protectedvoiddoPost(HttpServletRequest request, HttpServletResponse   response) throwsServletException, IOException {

       // 获取验证码

       String   valcode = request.getSession().getAttribute("valcode").toString();

       // 获取用户填写的验证码

       String   vcode = request.getParameter("vcode");

       // 进行验证

       if(!valcode.equals(vcode))

           System.out.println(">>>验证码错误!");

       else

           System.out.println(">>>验证码正确!");

    }

  上面只是根据验证情况在控制台进行了输出,使用时根据实际的业务逻辑需求进行修改即可。

    总起来说,验证码技术本质上就是利用Java绘图技术把随机产生的验证码字符图形化,并在JSP中以图形调用,最后在用户提交表单后在对应的servlet中进行验证。本文只是提供验证码的基本实现思路,希望大家能灵活应用。

  作者:中软卓越天津ETC

转载于:https://www.cnblogs.com/zretc/archive/2013/06/09/3129062.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO流复制图片

package IODemo;/*** author Alina* date 2021年11月14日 4:32 下午* 复制文件到指定目录**/ import java.io.*; public class IOcopyfile {public static void main(String[] args) {CopyDir(new File(“源文件”),new File(“目标文件”));}public static void CopyDir(File …

苏教版国标本小学语文第一册汉字笔画

苏教版国标本小学语文第一册汉字笔画 转载于:https://www.cnblogs.com/shangdawei/archive/2013/06/09/3129240.html

IO流与对象结合

package IODemo;import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Iterator;/*** author Alina* date 2021年11月08日 9:13 下午* 把Arraylist 里存储的内容存储到本地文件* 1.遍历集合。遍历一次存储一次*/ public…

正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——1 概述

说明&#xff1a;本系列文章介绍的算法均来自编译原理&#xff08;龙书&#xff09;一书&#xff0c;如果读者对代码没有兴趣&#xff0c;只想了解算法思路&#xff0c;完全可以阅读龙书相关章节内容&#xff0c;比我讲得清晰透彻。 序&#xff1a; 啃编译原理半年以来&#xf…

(JAVA)复制文件test.txt,并且排序。文件重新命名为test1.txt

//获取文件内的内容并排序public static void copyFile() throws Exception{//创建File 对象File sourece new File("/Desktop/pic/a.txt");//创建读字符流对象BufferedReader br new BufferedReader(new FileReader(sourece));//一次读取一行String str br.read…

C#如何使用httpwebrequest通过代理访问网页

string urlStr "http://www.itstrike.cn"; //设定要获取的地址 HttpWebRequest hwr (HttpWebRequest)HttpWebRequest.Create(urlStr); //建立HttpWebRequest对象 hwr.Timeout 60000; …

(JAVA)装饰流

package IODemo;/*** author Alina* date 2021年11月15日 11:48 下午* 设计思想&#xff1a;设计模式,装饰模式* JAVA中有23种设计思想&#xff0c;全部基于面向对象* 装饰设计模式&#xff0c;核心思想&#xff0c;解决什么问题* 增强原有对象的功能**/ //第一…

我的学习生涯(Delphi篇) - 21

我们平常要和图片打交道&#xff0c;那么我们如何把图片存在数据库中呢&#xff1f; -------------------------------------------------------------------------------------------------美丽分割线--------------------------- 年代&#xff1a;2007 文件&#xff1a;My091…

Map 的Properties集合存储IO流对象

package IODemo;import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties;/*** author Alina* date 2021年12月07日 11:29 下午* 集合IO一起使用* Map接口实现Hashtable 子类 Properties* 特点&#xff1a;线程安全&#xff0c;泛型Str…

WordPress的RSS订阅优化

一、确定一个永久的RSS地址 WordPress默认的订阅地址是www.domain.com/feed&#xff0c;使用这样的地址有三个比较大的缺陷&#xff1a; 1、无法统计多少人订阅了你。 2、博客更换域名或者被GFW后原RSS地址不能访问了&#xff0c;原来的读者群就流失了。 3、输出的内容太单调…

练习IO流

package IODemo;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; import java.util.Scanner;/*** author Alina* date 2021年12月08日 11:49 下午* 已知用户有一个文本文档&#xff0c;里面包含的键值对…

轻量级的ORM框架 fluentdata

codePlex 地址&#xff1a;http://fluentdata.codeplex.com/releases/view/82592转载于:https://www.cnblogs.com/Qiaoyq/archive/2013/06/11/3131428.html

(JAVA)线程

/*** author Alina* date 2021年12月12日 11:37 下午* 线程&#xff1a;分为三个级别* 1.定义类&#xff0c;继承Thread 类&#xff0c;继承线程类* 该类重写run&#xff08;&#xff09;方法* 创建子类对象* * 执行join方法的线程&#xff0c;会一次执行完毕&#xff0c;其…

(JAVA)序列化

对象序列化与反序列化 对象中的数据有&#xff1a;new Object() 自己的成员变量 如果对象的基本数据不变&#xff0c;反复使用 什么是序列化 将对象中的数据以二进制方式存入硬盘&#xff0c;永久保存 二进制文件可以在网络上传输 反序列化 将存在硬盘中的二进制文件,读取出来还…

某final神犇的工作感想

http://hi.baidu.com/codemao/item/0bc294417fbaeceba5c06690  。。。 这一年&#xff0c;工作上也渐渐步入正轨了&#xff0c;首先&#xff0c;我很庆幸在我刚工作的时候就能碰到一个好的经理&#xff0c;我想&#xff0c;工作上最重要的事情莫过于跟对组&#xff0c;跟对经理…