验证码基础
一.什么是验证码及它的作用
:验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录。
二.图文验证码的原理
:在servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在通过Java的绘图类以图片的形式输出该验证码。为了增加验证码的安全级别,可以输出图片的同时输出干扰线,最后在用户提交数据的时候,在服务器端将用户提交的验证码和Session保存的验证码进行比较。
三.验证码所需的技术
:i.因为验证码中的文字,数字,应为都是可变的,故要用到随机生成数技术。
ii.如果验证码中包含汉字,则要用到汉字生成技术.
iii.可以使用Ajax技术实现局部刷新
iv.可以使用图片的缩放和旋转技术,
vi.随机绘制干扰线(可以是折现,直线等)
vii.如果考虑到验证码的安全性,可以使用MD5加密.
验证码模块实例
1.编写生成英文,数字,汉字随机生成的Servlet类.源代码如下:
- package com.servlet;
- import java.awt.*;
- import java.awt.geom.*;
- import java.awt.image.*;
- import java.io.*;
- import java.util.*;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- import javax.imageio.ImageIO;
- 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++){
- switch(random.nextInt(3)){
- case 1: //生成A-Z的字母
- itmp=random.nextInt(26)+65;
- ctmp=String.valueOf((char)itmp);
- break;
- case 2: //生成汉字
- String[] rBase={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
- //生成第一位区码
- int r1=random.nextInt(3)+11;
- String str_r1=rBase[r1];
- //生成第二位区码
- int r2;
- if(r1==13){
- r2=random.nextInt(7);
- }else{
- r2=random.nextInt(16);
- }
- String str_r2=rBase[r2];
- //生成第一位位码
- int r3=random.nextInt(6)+10;
- String str_r3=rBase[r3];
- //生成第二位位码
- int r4;
- if(r3==10){
- r4=random.nextInt(15)+1;
- }else if(r3==15){
- r4=random.nextInt(15);
- }else{
- r4=random.nextInt(16);
- }
- String str_r4=rBase[r4];
- //将生成的机内码转换为汉字
- byte[] bytes=new byte[2];
- //将生成的区码保存到字节数组的第一个元素中
- String str_12=str_r1+str_r2;
- int tempLow=Integer.parseInt(str_12, 16);
- bytes[0]=(byte) tempLow;
- //将生成的位码保存到字节数组的第二个元素中
- String str_34=str_r3+str_r4;
- int tempHigh=Integer.parseInt(str_34, 16);
- bytes[1]=(byte)tempHigh;
- ctmp=new String(bytes);
- break;
- default:
- 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()); //输出图片
- }
- }
2.配置Servlet
在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><SPAN style="COLOR: #ff0000">com.servlet.PictureCheckCode</SPAN></servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>PictureCheckCode</servlet-name>
- <url-pattern>/<SPAN style="COLOR: #ff0000">PictureCheckCode</SPAN></url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
3.测试验证码
可以编写JSP页面来验证是否可以输出验证码图片,JSP代码如下:
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="" onclick="myReload()"> 看不清,换一个</a>
- <input type="submit" value="提交" />
- </form>
- </body>
- </html>
2.Check.jsp :主要验证提交的数据是否和Session中保存的验证码是否相同
- <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
- <html>
- <head>
- <title>验证码校验</title>
- </head>
- <body>
- <%
- String checkcode=request.getParameter("checkCode");
- if(checkcode.equals("")||checkcode==null){
- out.print("<script>alert('请输入验证码');window.location.href('index.jsp')</script>");
- }else{
- if(!checkcode.equalsIgnoreCase((String)session.getAttribute("randCheckCode"))){
- out.print("<script>alert('验证码不正确,请重新输入');history.back(-1);</script>");
- }else{
- out.print("登录成功");
- }
- }
- %>
- </body>
- </html>
4.工程项目结构,及运行截图
相关推荐
非常实现的验证码功能,可以用到项目中去,该源代码无jar包,没有有JavaScript,纯JAVAWEB代码,jsp页面,serlvet显示,简单易懂试用~~~~~
已实现功能:登录(验证码验证),增删改查,excel导入导出,显示头像。 使用说明 导入sql文件夹内的sql文件 运行项目 初始账户密码为Admin/123456,可更改。 javaweb期末课程设计学生信息管理系统源代码。已实现...
web项目实现验证码判断登录、注册功能
采用简单servlet生成加法验证码实例,可合并到struts、ssh2、mybatis等框架项目中,希望对你们有所帮助
二、技术实现 后端:spring+springmvc+mybatis 开发工具:eclipse、Navicat 运行环境:jdk1.8、Tomcat8;数据库:mysql5.0及以上;前端:jsp+jquery+css 三、系统划分与功能 系统包含三种角色:管理员、医生、病人,...
该项目是一套JavaWeb电商系统,仿京东商城,实现了电商网站的基本功能。主要包含以下模块: 1. 用户模块:实现用户的注册、登录、管理等功能。支持用户名密码登录和手机号验证码登录。注册要验证用户名唯一性。 2. 商品...
2.该项目前端使用汽车租借平台网页版开源框架改编。 3.主要涉及到的功能点有登录、注册、修改密码、修改个人信息、验证码、用户登录拦截、权限管理登录、三天免登录,汽车数据分页管理,添加到车库,移除车库,发布...
JavaWeb项目之实现用户注册、登录与预约功能一:项目需求二:总体概述三:代码分析1.登录功能2.注册功能3.预约功能四:效果展示 一:项目需求 1.实现注册与登录功能: 要求用到验证码,登录后该出不再显示登录与注册...
这是一个电子相册,可实现用户注册,登录,验证码验证,本地图片上传在线浏览等功能
> 表单页面使用一次性图形验证码; > 在servlet中再次做了表单校验。 > 注册成功时,使用javaMail给注册用户发送激活邮件,邮件中包含用于激活的链接,链接包含激活码参数; 用户激活:通过激活码查询用户,如果...
实现验证码的刷新,建立,使用的是js,Javaweb,具体已经实现过,这是整个项目
javaweb实现管理系统时所需的登录验证码,含有数字、字母以及干扰条。可以实现新闻管理系统:1.生成图片 2.保存图片上的文本到session中3.把图片响应给客户端
5.4 实现图形验证码 5.5 避免重复提交功能 5.6 缩略加水印图像 5.7 小结 第6章 网络硬盘 6.1 网络硬盘功能原理 6.2 网络硬盘功能具体实现——浏览磁盘和显示文件信息 6.3 网络硬盘功能具体...
基于JavaWeb的在线测验系统,实现了不同角色用户的登录和注册、发布测验、学生答题、班级管理、学生管理、教师管理、题目管理、自动测评等功能。 开发工具:IntelliJ IDEA 数据库:MySQL8 项目依赖如下 依赖名称 ...
十以内的加减乘验证码,myeclipse项目,直接导入myeclipse中发布到tomcat下即可使用
【项目介绍】 【备注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校...
参考JavaWeb项目实战实现的一个51购物商城。 web服务器:Tomcat 数据库:sql server 前端:jsp 总体结构 src文件 model:定义的是商品类Goodselement和用户类Member tools:定义CheckCode验证码处理的servlet,Chstr...
购物车管理:向购物车中添加商品、修改购物车中商品数量、删除购物车中商品、我的购物车、清空购物车,用户可以实现批量操作。 订单管理:通过购物车中商品生成订单(已支付和未支付状态,添加发货信息等)、查看我...
基于JAVAWEB(Jsp、Servlet、Jdbc、Mysql、Druid、commons-dbutils、jquery、ajax、html、css、javascript)MVC模式开发 已实现登陆,注册,验证码,开户,绑卡,提现,充值等 内附项目实现功能介绍及说明书
小的完整实现servlet jsp jdbc 实现增删改查 以及分页 项目严格按照项目一般规范,UI界面不是很好看,主要拉通了整个javaee阶段的大概知识,添加了filter c3p0连接池 以及验证码实现。学习路上,一起加油哟!