在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

JavaWeb中验证码的实现相关推荐

  1. java验证码技术_验证码技术(JavaWeb 中验证码的实现 )

    二.实践 下面通过程序演示验证码产生和实现验证的过程. 1.验证码的产生 创建一个Servlet完成验证码的产生.首先通过随机数的产生类Random随机产生一个4位的验证码, 并将其存入session ...

  2. javaweb中验证码验证实现

    验证码资料:https://pan.baidu.com/s/1tMCtnyy9f1t1ld5feyooDQ 1.注册表页面register.jsp <script type="text ...

  3. java输入验证码代码,JavaWeb 实现验证码功能(demo)

    验证码不用多说,在 WEB-APP 中一般应用于:登录.注册.买某票.秒杀等场景.大家都接触过~可以说是千奇百怪,各式各样. DEMO 目标功能 验证码页面输入. 页面更换验证码(异步实现). 后台验 ...

  4. java-web中的分层1-dao

    今天看了一下java-web中分层的相关的知识,其实对于我们初学者来说,一个好的分层结构不仅仅能让我们很好的清楚自己的逻辑,而且对以后项目的合作也是很重要的,其实我们在网上看一下有很多关于分层的例子, ...

  5. java web.xml 监听器_十:JavaWeb中的监听器(一)

    2.1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域 ...

  6. java 打开jsp文件_jsp文件怎么打开(java-web中jsp的理解)

    jsp文件怎么打开(java-web中jsp的理解)JSP:Java Server Pages.JSP是一种网页的编码格式,不同于HTML的是JSP中是由 HTML中的标签指令 和 Java逻辑代码 ...

  7. JavaWeb中的乱码解决方法总结

    JavaWeb中的乱码解决方法总结 get请求提交中文(参数放在url中) 原因:服务器获取解析url的时候不知道编码规则 修改Tomcat服务器的安装路径下的conf目录下的配置文件server.x ...

  8. JavaWeb中的Session、SessionListener、在线人数统计

    2019独角兽企业重金招聘Python工程师标准>>> JavaWeb中的Session 在JavaWeb中使用HttpSession(以下简称session)对象来表示一个会话. ...

  9. javaweb中实现分页,持续更新……

    大家好,欢迎来到雄雄的小课堂,昨天分享了个分页工具类一个简单的分页工具类,其实,也是为今天的分享做的铺垫,今天,给大家带来的是javaweb实现分页的全过程! 前言:为什么需要分页?假设某大学有人数一 ...

最新文章

  1. GPUImage简单说明
  2. 深蓝学院《从零开始手写VIO》作业三
  3. 让计算机等待的函数_第56p,装饰器,闭包函数的应用
  4. linux线程能删除自身吗,Linux内核本身和进程的区别 内核线程、用户进程、用户...
  5. java求字符串数组交集、并集和差集
  6. Dell笔记本Alienware Command Center监测不到CPU和内存数据
  7. Python数据库编程
  8. 大一c语言餐馆叫号系统,专业体检中心排队叫号系统厂家
  9. 万达商管再次递表港交所:上半年净利润40亿元,外部股东阵容强大
  10. 读论文——A Joint Model for Aspect-Category Sentiment Analysis with Shared Sentiment Prediction Layer
  11. python row函数_Python extmath.row_norms方法代码示例
  12. 猫九先森教你如何优雅的玩
  13. 37岁程序员裸辞,120天被497家公司拒绝,网友:为自己的冲动买单
  14. 记一次java实现excel导出
  15. android ram rom测试工具,RAM与ROM测试方法
  16. 【Python篇】拟牛顿法面面俱到(一)--牛顿插值法
  17. 每个人都应该学的技能 - 如何做出好决定
  18. 中国计量大学计算机专业全国名次多少,中国计量大学实力水平如何,全国排名是多少?...
  19. 手机否总是欠费?一波操作,让你一目了然手机偷偷订了哪些业务
  20. 国内有哪些VPS值得推荐?

热门文章

  1. 保姆级!!前端必会Taro入门级教学!!
  2. React开发(116):ant design search引入
  3. Taro+react开发(26)taro基本骨架
  4. [html] 如何垂直居中<img>?
  5. [vue] 怎么解决vue动态设置img的src不生效的问题
  6. 前端学习(2737):重读vue电商网站47之生成打包报告
  7. 前端学习(2661):生命周期
  8. 前端学习(2462):打包优化
  9. “约见”面试官系列之常见面试题第二十三篇之get和post区别(建议收藏)
  10. 前端学习(1891)vue之电商管理系统电商系统之el-table渲染表格