接着上篇的博客,笔者已经说明了验证码在我们项目中的作用,也说明了实现的方法。上一篇的博客笔者已经介绍了一种的实现方法,那么在这一篇的博客中,笔者要说明的是二种的实现方法。这种方法的实现就是在java的类中实现生产验证码。在实际项目中,就根据实际情况来选择,二者没有谁好谁坏的说法。

1.代码实现

1)        首先,笔者也是一样,先创建登录的页面,登录页面比较简单,无非就是一个用于输入验证码的地方、一个验证码显示的、一个用于重新生成验证码的连接、一个提交的按钮。笔者将页面的叫index.jsp.

 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>  <head>  <title>验证码</title>  <script language="javascript">
function myReload() {  document.getElementById("CreateCheckCode").src = document  .getElementById("CreateCheckCode").src  + "?nocache=" + new Date().getTime();
}
</script>  </head>  <body>  <form action="Check.jsp" method="post">  <input name="checkCode" type="text" id="checkCode" title="验证码区分大小写"  size="8" ,maxlength="4" />  <img src="PictureCheckCode" id="CreateCheckCode" align="middle">  <a href="" οnclick="myReload()"> 看不清,换一个</a>  <input type="submit" value="提交" />  </form>  </body>
</html>

2)        读者已经看到了,表单提交的信息不是直接到后端去验证,而是到check.jsp的页面验证。这里无法也是从session中获取验证码与当前客户输入的验证码进行比较。

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>  <head>  <title>验证码</title>  <script language="javascript">
function myReload() {  document.getElementById("CreateCheckCode").src = document  .getElementById("CreateCheckCode").src  + "?nocache=" + new Date().getTime();
}
</script>  </head>  <body>  <form action="Check.jsp" method="post">  <input name="checkCode" type="text" id="checkCode" title="验证码区分大小写"  size="8" ,maxlength="4" />  <img src="PictureCheckCode" id="CreateCheckCode" align="middle">  <a href="" οnclick="myReload()"> 看不清,换一个</a>  <input type="submit" value="提交" />  </form>  </body>
</html>

3)        现在我们要说一下后端的验证是如何生成的,其实也就是将上一篇博客的jsp的代码转变为PictureCheckCode.java的代码就行了。实现的过程就不多说是,相信读者可以看懂的。

 public class PictureCheckCode extends HttpServlet {  private static final long serialVersionUID = 1L;  public PictureCheckCode() {  super();  }  public void destroy() {  super.destroy();   }  public void init() throws ServletException {  super.init();  }  /*该方法主要作用是获得随机生成的颜色*/   public Color getRandColor(int s,int e){  Random random=new Random ();  if(s>255) s=255;  if(e>255) e=255;  int r,g,b;  r=s+random.nextInt(e-s);    //随机生成RGB颜色中的r值  g=s+random.nextInt(e-s);    //随机生成RGB颜色中的g值  b=s+random.nextInt(e-s);    //随机生成RGB颜色中的b值  return new Color(r,g,b);  }  @Override  public void service(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  //设置不缓存图片  response.setHeader("Pragma", "No-cache");  response.setHeader("Cache-Control", "No-cache");  response.setDateHeader("Expires", 0);  //指定生成的响应图片,一定不能缺少这句话,否则错误.  response.setContentType("image/jpeg");  int width=86,height=22;     //指定生成验证码的宽度和高度  BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建BufferedImage对象,其作用相当于一图片  Graphics g=image.getGraphics();     //创建Graphics对象,其作用相当于画笔  Graphics2D g2d=(Graphics2D)g;       //创建Grapchics2D对象  Random random=new Random();  Font mfont=new Font("楷体",Font.BOLD,16); //定义字体样式  g.setColor(getRandColor(200,250));  g.fillRect(0, 0, width, height);    //绘制背景  g.setFont(mfont);                   //设置字体  g.setColor(getRandColor(180,200));  //绘制100条颜色和位置全部为随机产生的线条,该线条为2f  for(int i=0;i<100;i++){  int x=random.nextInt(width-1);  int y=random.nextInt(height-1);  int x1=random.nextInt(6)+1;  int y1=random.nextInt(12)+1;  BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //定制线条样式  Line2D line=new Line2D.Double(x,y,x+x1,y+y1);  g2d.setStroke(bs);  g2d.draw(line);     //绘制直线  }  //输出由英文,数字,和中文随机组成的验证文字,具体的组合方式根据生成随机数确定。  String sRand="";  String ctmp="";  int itmp=0;  //制定输出的验证码为四位  for(int i=0;i<4;i++){  itmp=random.nextInt(10)+48;  ctmp=String.valueOf((char)itmp);  //    break;  // }  sRand+=ctmp;  Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));  g.setColor(color);  //将生成的随机数进行随机缩放并旋转制定角度 PS.建议不要对文字进行缩放与旋转,因为这样图片可能不正常显示  /*将文字旋转制定角度*/  Graphics2D g2d_word=(Graphics2D)g;  AffineTransform trans=new AffineTransform();  trans.rotate((45)*3.14/180,15*i+8,7);  /*缩放文字*/  float scaleSize=random.nextFloat()+0.8f;  if(scaleSize>1f) scaleSize=1f;  trans.scale(scaleSize, scaleSize);  g2d_word.setTransform(trans);  g.drawString(ctmp, 15*i+18, 14);  }  HttpSession session=request.getSession(true);  session.setAttribute("randCheckCode", sRand);  g.dispose();    //释放g所占用的系统资源  ImageIO.write(image,"JPEG",response.getOutputStream()); //输出图片  }
}

4)        最后,别忘了在web.xml的文件加上配置。

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><servlet>  <description>输出验证码</description>  <display-name>This is the display name of my J2EE component</display-name>  <servlet-name>PictureCheckCode</servlet-name>  <servlet-class>com.owen.usercode.servlet.PictureCheckCode</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>PictureCheckCode</servlet-name>  <url-pattern>/PictureCheckCode</url-pattern>  </servlet-mapping>  <welcome-file-list>  <welcome-file>index.jsp</welcome-file>  </welcome-file-list>
</web-app>

5)        说明:项目可能用到的jar有:javax.servlet-5.1.12.jar、jstl-1.2.jar

2.实现功能

1)        登录页面。

2)        登录成功。

3.项目结构

网站安全之为Web项目添加验证码功能(二)相关推荐

  1. maven 如何给web项目添加jar包依赖

    maven 如何给web项目添加jar包依赖 CreateTime--2018年4月19日19:06:21 Author:Marydon 开发工具:eclipse 1.打开pom.xml文件--> ...

  2. Myeclipse2015把web项目添加至tomcat中,添加列表中却没有想要添加的项目

    Myeclipse2015把web项目添加至tomcat中,添加列表中却没有想要添加的项目?? 解决方法: 项目-右键-Properties-Myeclipse-Project Factes -  D ...

  3. element-plus+vite+guiplan注册页面添加验证码功能

    element-plus+vite+guiplan注册页面添加验证码功能 element-plus+vite+guiplan注册页面添加验证码功能 介绍 步骤 总结 element-plus+vite ...

  4. idea为web项目添加tomcat并配置Artifacts

    背景 有一天聪明的小峰从网上找了一个web项目,但是只有代码没有启动步骤,作为小白的我解决这个问题也不太顺利特此记录一下. 主要解决的问题: 为项目添加tomact 配置Artifacts 引入 ja ...

  5. Java web项目添加Struts2支持的步骤

    今天开始学习Struts2了,Struts2使用了MVC的设计模式,使Java web应用层次更分明,是非常流行的一种框架,下面我记录在Java web应用中添加Struts2支持的几个步骤: 一.在 ...

  6. ipv6服务器搭建网站,IPV6地址访问web项目网站配置

    本示例在win10环境下 1,打开命令窗口,输入ipconfig命令 如红色箭头所示为ipv6的地址,但是发现地址中含有%百分号,查了相关文档,这个标识符通常指网络接口,并且通过一个百分号(%)被附加 ...

  7. Spring Boot项目邮箱验证码功能的实现(以QQ邮箱为例)

    既然前两天翻出我大学时期做的一个项目,那正好顺手将其中的邮箱验证码功能也分享记录一下. 开启QQ邮箱传输协议服务 进入QQ邮箱界面,点击设置--账户--开启以下两个服务,当开启IMAP/SMTP会有一 ...

  8. html表单输入框添加验证码,织梦Dedecms为自定义表单添加验证码功能

    使用织梦Dedecms自定义表单的时候,即使你做了字段的验证,也很有可能被人刷很多垃圾的内容,更加安全的一个方法是为自定义表单添加上验证码功能.今天我就来为大家分享一下怎样给自定义表单添加验证码! 一 ...

  9. 为WebApi项目添加注册功能:问题与解决的思维流程

    为WebApi项目增加用户注册功能 创建时间:2012年10月31日(星期三) 凌晨3:26 | 分类:Web演练 | 字数:3438  | 发送到我的Qzone | 另存为... | 打印 | 添加 ...

  10. php防止恶意注册,WordPress防恶意注册-添加验证码功能 | 逗哥-架构师之路

    WordPress注册用户添加验证码,我这种小博客基本很少用到给网友注册用户的,登录后台添加验证码,找回密码添加验证码文章都写了,拽立网,也不差这个注册用户添加验证码文章了,大概差不多只需要一串代码就 ...

最新文章

  1. 用 C 语言开发一门编程语言 — 交互式解释器
  2. scala与python混合调用实验
  3. python怎么限制输出精度_谈谈关于Python里面小数点精度控制的问题
  4. openstack-networking-neutron(一)---端到端和点到点的理解
  5. 语言坐标度分秒的换算_测量位置度说明
  6. Java环境变量CLASSPATH详解(转载)
  7. python类的成员没有访问控制限制_Python 访问限制 private public的详细介绍
  8. VB后台获得按键,并执行自己的函数(非钩子及热键)
  9. python内存泄漏解决方案_Python内存泄漏和内存溢出的解决方案
  10. Hugging Face Course-Introduction学习小记 (part2)
  11. 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
  12. 《windows 鼠标指针文件 学习笔记》
  13. python usb摄像头 截图_python实现摄像头远程截图功能
  14. 如何在 Python 中调用函数?九种方法任你挑选
  15. 深圳哈工大计算机系的课表,学在哈深|哈工大(深圳)学子课表大比拼,今天你满课了吗?...
  16. Android震动和自定义铃声
  17. web前端开发面试都喜欢问什么
  18. H3C Neighbor Discovery Protocol,邻居发现协议
  19. 网站cookie和曲奇饼干_谷歌扔饼干和营销人员感到恶心
  20. A man who has iron bone

热门文章

  1. 世界是数字的读后感:
  2. Python 多线程7-线程通信
  3. 面试题——轻松搞定面试中的“虚
  4. 多记,多问为什么,最古老的学习方法怎么能丢?!
  5. 系统登陆后自动注销的解决办法!
  6. DR模式 + keepalived
  7. HCIP-RS-GRE
  8. matlab各种出错,matlab常见错误命令汇总
  9. ELK详解(六)——Logstash部署与简单应用
  10. HTTP协议基本原理简介(三)