JavaWeb中验证码的实现

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

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

1. 验证码的产生

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


protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, 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;

BufferedImage img = 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(newColor(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中存储的验证码进行比对,根据结果给出不同提示。代码如下:


protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, 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中进行验证。本文只是提供验证码的基本实现思路,希望大家能灵活应用。

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

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

1. 验证码的产生

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


protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, 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;

BufferedImage img = 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(newColor(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中存储的验证码进行比对,根据结果给出不同提示。代码如下:


protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, 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中进行验证。本文只是提供验证码的基本实现思路,希望大家能灵活应用。

时间: 2024-10-09 02:02:32

JavaWeb中验证码的实现的相关文章

ASP.NET在实际开发中验证码的用法

在网上有看到很多关于验证码的代码,很多都只是生成一张验证码图片,然而在实际登陆验证模块,验证码要怎么添加进去或者说怎么运用.和实际项目开发中要怎么使用验证码,我自己总结了几点. 一.在实际开发登陆模块的验证码,程序员是将验证码的文本值(字符串)存在Session中的,然后在登陆验证的时候,通过Session取值进行判断的,这样效率会高很多. 二.然而在写验证码的时候要想通过Session存值,就必须实现System.Web.SessionState.IRequiresSessionState这个

个人对JavaWeb中MVC与三层架构的区别理解

JavaWeb中MVC是指B/S结构开发中的一种设计模式,能够将Web页面与业务逻辑以及数据库操作之间的耦合性降到最低点,易于代码的重用以及后期维护.而三层架构的概念在JavaWeb中则是指Web层,业务层,数据层.但三层架构中却是把MVC中的Model,也就是JavaBeans分成业务层和数据层,而把Controller控制器以及View视图合并成Web层.二者之间最大的区别在于MVC只限于JavaWeb,而三层架构则能够实现在非Web应用平台之上,只需替换掉Web层足以,而业务层与数据层依旧

struts2中验证码的生成和使用

第一步生产字符串: package com.yancode.demo; import java.util.Arrays; /* * 一步一步来,要生成验证码图片,首先要有验证码,然后才能在画在图片上.为了能够灵活控制验证码, * 特别编写了SecurityCode类,它向外提供随机字符串.并且可以控制字符串的长度和难度. * SecurityCode类中提供的验证码分三个难度,易(全数字).中(数字+小写英文).难(数字+大小写英文). * 难度使用枚举SecurityCodeLevle表示,避

javaWeb中的文件上传下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

frame框架中验证码图片抓取(VB2010)

今日写一个验证码识别自动登录的程序,发现网页中验证码图片是嵌在frame框架中,一时间遇到了问题无法搞定,网上搜了很多网页也没有具体的解决办法,今日偶然尝试居然搞定了,给大家分享一下. HTML的源程序模拟如下: <body> <iframe src="hello.jpg"></iframe> </body> 真实的场景SRC是一个类似于checkcode.ASP的链接,不能直接通过WEB地址抓取,不然图片就会变了,这个估计大家都知道,抓

yii2中验证码的添加

首先,在模型中添加验证码字段: public function rules(){ return ['verifyCode', 'captcha'], } 其次,可以在函数attributeLabels中添加前台页面中验证码的字段名称: public function atrributeLabels(){ return ['verifyCode'=>'Verification Code', ]; } 然后,在视图文件中做如下修改: use yii\captcha\Captcha; <?= $fo

MVC的设计模式在JavaWeb中的实现

JSP开发模式 jsp开发模式的发展 1.模式1:(适合小型项目的技术的开发) a.第一版本,纯jsp(封装数据,处理数据,显示数据) b.第二版本,Jsp+JavaBean. jsp:收集数据,显示数据 JavaBean:封装.处理 2.模式2:servlet+Jsp+JavaBean(是mvc在java中的具体的实现,是java技术实现的具体的内容) a.servlet:负责协调jsp和javabean,获得数据,处理数据(业务逻辑),封装到javabean中,选择jsp去显示数据. b.j

JavaWeb中的监听器

JavaWeb中的监听器 l  事件源:三大域! ServletContext ¨       生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用: 2       void contextInitialized(ServletContextEvent sce):创建SErvletcontext时 2       void contextDestroyed(ServletContextEvent sce):销毁Servletcontext

JavaWeb中的绝对路径和相对路径问题

在开发的时候,因为路径,往往会造成很多问题.所以开发时,JavaWeb尽可能的用绝对路径 a.jsp <span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><body> <h1>A page</h1> <a href="pathProblem/b.jsp">To B page</a> </body>&