网站安全之为Web项目添加验证码功能(二)
接着上篇的博客,笔者已经说明了验证码在我们项目中的作用,也说明了实现的方法。上一篇的博客笔者已经介绍了一种的实现方法,那么在这一篇的博客中,笔者要说明的是二种的实现方法。这种方法的实现就是在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项目添加验证码功能(二)相关推荐
- maven 如何给web项目添加jar包依赖
maven 如何给web项目添加jar包依赖 CreateTime--2018年4月19日19:06:21 Author:Marydon 开发工具:eclipse 1.打开pom.xml文件--> ...
- Myeclipse2015把web项目添加至tomcat中,添加列表中却没有想要添加的项目
Myeclipse2015把web项目添加至tomcat中,添加列表中却没有想要添加的项目?? 解决方法: 项目-右键-Properties-Myeclipse-Project Factes - D ...
- element-plus+vite+guiplan注册页面添加验证码功能
element-plus+vite+guiplan注册页面添加验证码功能 element-plus+vite+guiplan注册页面添加验证码功能 介绍 步骤 总结 element-plus+vite ...
- idea为web项目添加tomcat并配置Artifacts
背景 有一天聪明的小峰从网上找了一个web项目,但是只有代码没有启动步骤,作为小白的我解决这个问题也不太顺利特此记录一下. 主要解决的问题: 为项目添加tomact 配置Artifacts 引入 ja ...
- Java web项目添加Struts2支持的步骤
今天开始学习Struts2了,Struts2使用了MVC的设计模式,使Java web应用层次更分明,是非常流行的一种框架,下面我记录在Java web应用中添加Struts2支持的几个步骤: 一.在 ...
- ipv6服务器搭建网站,IPV6地址访问web项目网站配置
本示例在win10环境下 1,打开命令窗口,输入ipconfig命令 如红色箭头所示为ipv6的地址,但是发现地址中含有%百分号,查了相关文档,这个标识符通常指网络接口,并且通过一个百分号(%)被附加 ...
- Spring Boot项目邮箱验证码功能的实现(以QQ邮箱为例)
既然前两天翻出我大学时期做的一个项目,那正好顺手将其中的邮箱验证码功能也分享记录一下. 开启QQ邮箱传输协议服务 进入QQ邮箱界面,点击设置--账户--开启以下两个服务,当开启IMAP/SMTP会有一 ...
- html表单输入框添加验证码,织梦Dedecms为自定义表单添加验证码功能
使用织梦Dedecms自定义表单的时候,即使你做了字段的验证,也很有可能被人刷很多垃圾的内容,更加安全的一个方法是为自定义表单添加上验证码功能.今天我就来为大家分享一下怎样给自定义表单添加验证码! 一 ...
- 为WebApi项目添加注册功能:问题与解决的思维流程
为WebApi项目增加用户注册功能 创建时间:2012年10月31日(星期三) 凌晨3:26 | 分类:Web演练 | 字数:3438 | 发送到我的Qzone | 另存为... | 打印 | 添加 ...
- php防止恶意注册,WordPress防恶意注册-添加验证码功能 | 逗哥-架构师之路
WordPress注册用户添加验证码,我这种小博客基本很少用到给网友注册用户的,登录后台添加验证码,找回密码添加验证码文章都写了,拽立网,也不差这个注册用户添加验证码文章了,大概差不多只需要一串代码就 ...
最新文章
- 用 C 语言开发一门编程语言 — 交互式解释器
- scala与python混合调用实验
- python怎么限制输出精度_谈谈关于Python里面小数点精度控制的问题
- openstack-networking-neutron(一)---端到端和点到点的理解
- 语言坐标度分秒的换算_测量位置度说明
- Java环境变量CLASSPATH详解(转载)
- python类的成员没有访问控制限制_Python 访问限制 private public的详细介绍
- VB后台获得按键,并执行自己的函数(非钩子及热键)
- python内存泄漏解决方案_Python内存泄漏和内存溢出的解决方案
- Hugging Face Course-Introduction学习小记 (part2)
- 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
- 《windows 鼠标指针文件 学习笔记》
- python usb摄像头 截图_python实现摄像头远程截图功能
- 如何在 Python 中调用函数?九种方法任你挑选
- 深圳哈工大计算机系的课表,学在哈深|哈工大(深圳)学子课表大比拼,今天你满课了吗?...
- Android震动和自定义铃声
- web前端开发面试都喜欢问什么
- H3C Neighbor Discovery Protocol,邻居发现协议
- 网站cookie和曲奇饼干_谷歌扔饼干和营销人员感到恶心
- A man who has iron bone