JavaWeb验证码的使用
在Java Web开发中,我们经常需要使用到验证码功能,一般情况下,我们可以将产生的验证码保存到服务器端中的session中,这种方式中,是使用服务器来保证验证码的功能。另外,我们也可以采用js产生验证码。
一、服务器产生验证码
后台服务器产生一个验证码的二进制数据流,直接代码如下:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.usitao.common.constants.Constant;
import net.usitao.common.constants.ParameterConstants;
import net.usitao.common.constants.ResponseCode;
import net.usitao.common.util.barcode.Code128Barcode;
import net.usitao.model.ResponseObject; import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class CodeController extends BasicController { private static final long serialVersionUID = 9095917149775028196L;
private static final Logger log = Logger.getLogger(CodeController.class);
private final static char[] BASIC_CHARACTERS = "qwertyuioplkjhgfdsazxxcvbnm1234567890".toCharArray();
private final static int[] DEFAULT_WORD_COLOR = { 0x000000, 0x292421, 0x708069, 0x4169E1, 0x6A5ACD, 0xFF6100, 0x082E54, 0x385E0F, 0xFF0000, 0x802A2A, 0x8A360F, 0x873324, 0x5E2612, 0x8B4513, 0x0000FF, 0xB0171F, 0xB22222, 0xE3170D, 0x228B22, 0x8A2BE2, 0x0B1746, 0x191970, 0x483D8B, 0x191970 };
private static int WORD_COLOR_SIZE = DEFAULT_WORD_COLOR.length; public int codeLength = 4;
public int width = 110;
public int height = 30; @RequestMapping(value = "/code/generate", method = { RequestMethod.GET })
public void generateCode(HttpServletRequest request, HttpServletResponse response) {
// 定义图像buffer
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics(); // 创建一个随机数生成器类
Random random = new Random(System.currentTimeMillis()); // 将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height); // 画边框。
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1); // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
for (int i = 0; i < 20; i++) {
int x = random.nextInt(width) - 5;
int y = random.nextInt(height) - 5;
int xl = random.nextInt(width);
int yl = random.nextInt(height);
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawLine(x, y, x + xl, y + yl);
} // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBuffer randomCode = new StringBuffer();
int x = 10;
int y = height - 5; g.setColor(Color.BLACK);
g.setFont(g.getFont().deriveFont(Font.BOLD, 30f)); // 随机产生codeCount数字的验证码。
for (int i = 0; i < codeLength; i++) {
// 得到随机产生的验证码数字。
String strRand = String.valueOf(BASIC_CHARACTERS[random.nextInt(36)]); // 用随机产生的颜色将验证码绘制到图像中。
g.setColor(new Color(DEFAULT_WORD_COLOR[random.nextInt(WORD_COLOR_SIZE + 1) - 1])); /**** 随机缩放文字并将文字旋转指定角度 **/
// 将文字旋转指定角度
Graphics2D g2d_word = (Graphics2D) g;
AffineTransform trans = new AffineTransform();
//trans.rotate(random.nextInt(30) * 3.14 / 180);
// 缩放文字
float scaleSize = random.nextFloat() + 0.8f;
if (scaleSize > 1.1f) {
scaleSize = 1f;
}
trans.scale(scaleSize, scaleSize);
g2d_word.setTransform(trans);
/************************/ g.drawString(strRand, x, y);
x += random.nextInt(10) + 20; // 将产生的四个随机数组合在一起。
randomCode.append(strRand);
} // 将四位数字的验证码保存到Session中。
request.getSession().setAttribute(Constant.SECURITY_CODE_KEY, randomCode.toString());
g.dispose(); try {
// 禁止缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
// 指定生成的响应是图片
response.setContentType("image/jpeg");
ImageIO.write(buffImg, "JPEG", response.getOutputStream());
} catch (IOException e) {
log.error("创建验证码失败", e);
}
} @RequestMapping(value = "/code/check", method = { RequestMethod.GET })
@ResponseBody
public ResponseObject<Object> checkCode(@RequestParam(value = ParameterConstants.COMMON_VALIDATE_CODE) String vcode, HttpServletRequest request) {
if (checkVerifyCode(request, vcode)) {
request.getSession().removeAttribute(Constant.SECURITY_CODE_KEY);
return new ResponseObject<Object>(ResponseCode.SUCCESS_CODE);
} else {
return new ResponseObject<Object>(ResponseCode.VALIDATE_CODE_ERROR, "验证码输入错误,请重新输入");
}
}
}
然后在前台的jsp或者html页面中,像下面这样写就可以了,
<img src="code/generate" id="code1" style="cursor: hand;" alt="看不清,换一张" />
$("#code1").attr('src','code/generate?timestamp=' + new Date().getTime());
效果是:

二、js端产生验证码
在这里只是简单的写一种实现方式,网上有很多的产生验证码的js库,可以自行下载到项目中使用。
var code ; //在全局定义验证码
//产生验证码
window.onload = function createCode(){
code = "";
var codeLength = 4;//验证码的长度
var checkCode = document.getElementById("code");
var random = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z');//随机数
for(var i = 0; i < codeLength; i++) {//循环操作
var index = Math.floor(Math.random()*36);//取得随机数的索引(0~35)
code += random[index];//根据索引取得随机数加到code上
}
checkCode.value = code;//把code值赋给验证码
}
//校验验证码
function validate(){
var inputCode = document.getElementById("input").value.toUpperCase(); //取得输入的验证码并转化为大写
if(inputCode.length <= 0) { //若输入的验证码长度为0
alert("请输入验证码!"); //则弹出请输入验证码
}
else if(inputCode != code ) { //若输入的验证码与产生的验证码不一致时
alert("验证码输入错误!@_@"); //则弹出验证码输入错误
createCode();//刷新验证码
document.getElementById("input").value = "";//清空文本框
}
else { //输入正确时
alert("^-^"); //弹出^-^
}
}
checkCode.js
调用js的html写法是:
<html>
<head>
<title>验证码</title>
<style type="text/css">
#code
{
font-family:Arial;
font-style:italic;
font-weight:bold;
border:0;
letter-spacing:2px;
color:blue;
}
</style>
<script type = "text/javascript" src = "checkCode.js">
</script>
</head>
<body>
<div>
<input type = "text" id = "input"/>
<input type = "button" id="code" onclick="createCode()"/>
<input type = "button" value = "验证" onclick = "validate()"/>
</div>
</body>
</html>
Html
JavaWeb验证码的使用的更多相关文章
- javaweb实现验证码功能
在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class ValiImg extends HttpSer ...
- JAVAWEB项目如何实现验证码 (转)
JAVAWEB项目如何实现验证码 2012-12-21 21:19 56026人阅读 评论(36) 收藏 举报 .embody { padding: 10px 10px 10px; margin: 0 ...
- javaweb基础(8)_HttpServletResponse生成验证码
一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类,
- [javaweb]javaweb中HttpServletResponse实现文件下载,验证码和请求重定向功能
HttpServletResponse web服务器接受到客户端的http请求之后,针对这个请求,分别创建一个代表请求的httpServletRequest和代表响应的HttpServletRespo ...
- JAVAWEB项目实现验证码中文、英文、数字组合
验证码基础 一.什么是验证码及它的作用 :验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意 ...
- JAVAWEB项目如何实现验证码
验证码基础 一.什么是验证码及它的作用 :验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意 ...
- 验证码javaweb
package cn.itcast.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impo ...
- JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)
1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatche ...
- javaweb学习总结(九)—— 通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
随机推荐
- collectionviewcell 添加删除按钮 响应区域的问题
在collectionviewcell 的右上角添加了一个删除按钮,但是发现只有cell和删除按钮重合的区域才会响应点击事件 后来doctor 李说这是iOS 事件响应链的机制(http://www. ...
- STM32——timer
原文地址: http://blog.sina.com.cn/s/blog_49cb42490100s6ud.html 1. STM32的Timer简介 STM32中一共有11个定时器,其中 ...
- 基于RBAC的权限设计模型
个部件模型组成,这4个部件模型分别是基本模型RBAC0(Core RBAC).角色分级模型RBAC1(Hierarchal RBAC).角色限制模型RBAC2(Constraint RBAC)和统一模 ...
- 虔诚的墓主人(bzoj 1227)
Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己 ...
- ipyparallel 中的 pi的求法
1.PI的求法的数学依据 如图,可以看见在边长为1的正方形里面,有一个1/4圆,我们随机在正方形中取点,点在圆内的概率和点在正方形内的概率之比正好为两者的面积之比.这样就有在圆内的点的数目比所有点的数 ...
- iOS 之 后台下载,前台显示模式,双 block
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //耗时的操作 NSURL *url ...
- MySQL安装 MySQL5.7.10免安装版配置,mysql5.7.10免安装版
MySQL5.7.10免安装版配置,mysql5.7.10免安装版 最新版的 Mysql 不提供图形界面的安装了, 下载下来是一个压缩包的形式, 那么我们如何来使用它呢, 让它为我们工作呢? 环境: ...
- 微信小程序来了,小程序都能做些什么
2017年的微信大动作就是微信小程序了,到底小程序都能做些什么?这是很多人关注的热点,小程序开发对企业又有什么帮助呢?下面让厦门微信小程序开发公司来为你就分析下. 微信小程序与APP的关系 ...
- thinkphp 配置项总结
'URL_PATHINFO_DEPR'=>'-',//修改URL的分隔符 'TMPL_L_DELIM'=>'<{', //修改左定界符 'TMPL_R_DELIM'=>'}&g ...
- Flash安全的一些总结
整理了下Flash安全相关的知识,后面会再完善 一.先来说crossdomain.xml这个文件 flash如何跨域通信,全靠crossdomain.xml这个文件.这个文件配置在服务端,一般为根目录 ...