Java生成验证码
在网站访问量很大的情况下为了增加网站的安全性
采用服务器端生产验证码的形式可以起到阻止恶意访问对网站带来的压力
下面介绍一下Java生成验证码的过程:
//该验证码是在Struts2 action中生成的!!!Servlet中也是如此
//使用到的都是Java中的包 java.awt中的几个类 BufferedImage , Graphics , Color , Font ,ImageIO
... CheckCodection extends ActionSupport{
private HttpServletRequest request = ServletActionContext.getRequest();
private HttpServletResponse response = ServletActionContect.getResponse();
public void checkCode()
{
//1 ,防止浏览器缓存生成的随机图片
response.setDataHeader("Expries",-1) ;
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");
//告诉浏览器以图片的形式打开请求数据
response.setHeader("Context-Type","image/jpeg")
//2 ,在内存当中创建一张图片BufferedImage ,确定 宽 高 类型
BufferedImage image = new BufferedImage(100 , 50 , BufferedImage.TYPE_INT_BGR );
//要在图片上写入数据 先要拿到画笔 Graphics
Graphics graphics = image.getGraphics();
graphics.setColor( Color.PINK ); //设置该图片的背景色
graphics.fillRect( 0 , 0 , 100 , 50 ); // 设置填充颜色的 起始坐标 宽 和 高
//设置写入的字体颜色 和字体风格
graphics.setColor( Color.BLACK ); //图片上的字体颜色
graphics.setFont( new Font( null , Font.BOLD , 20 ) ); //字体加粗 字号为 20
//调用随机生成验证码的函数 codeNum();
String num = codeNum();
//将生成的随机数保存到HttpSession中 和用户输入的进行比较判断
HttpSession session = request.getSession( true );
session.setAttribute("checkCode" , num );
//使用画笔graphics 将生成的字符串写到已经创建好的图片上
graphics.drawString( num , 0 , 0 ) ; //后两个参数代表 写入数据是的起点坐标 x, y
//将生成的图片以流的形式写到浏览器
ImageIO.writer( image , "jpg" , request.getOutputStream() );
}
//生成数据数的函数
private String codeNum()
{
//Java中生成随机数的类 Random 类 也可使用Math类中的Math.random();方法自行选用
Random random = new Random() ;
StringBuffer sb = new StringBuffer(); //生成可变字符串对象StringBufere
String[] select = new String [] {"0","1","2","3","4","5",
"6","7","8","9","A","B","C",
"D","E","F","G","H","J","K",
"L","M","N","P","Q","R","S",
"T","U","V","W","X","Y","Z"};
for( int i=0 ; i<5 ; i++)
{
Integer num = random.nextInt( 36 ); //该方法的回值在0 到 35之间 包涵 0 但不包涵 36
sb.append( select[num] ) ;
}
return sb.toString() ;
}
}
//在struts.xml 配置该action后进行访问
<package name="struts2" extends="struts-default">
<action name="checkCode" class="com.fengyi.web.CheckCodection" method="checkCode">
</action>
</package>
//以上手写没有导包请见谅!!!!
//试图界面以下代码即可
......
<img art="验证码" src="checkCode"/> <a>换一张</a>
.....
//若是像要点击更换就是在访问一下创建 验证码的Action
使用JQuery
代码如下: 倒库省略...
$(document).ready(function(){
//得到a 标签节点
$("a").css("cursor","pointer").click(function(){
//改变一下图片的src 即可
$("img").arrt("scr","checkCode?name=Math.random()") ;
//name=Math.random() 加上该行代码只是为了防止浏览器不刷新
});
});
------也可以使用css+js脚本生成较为简单的验证码!-------
---项目不是太挑剔是可以使用的---
--css样式--
<style type="text/css"> .code{ background-image:url(code.jpg); font-family:Arial;
font-style:italic;
color:Red; border:0; padding:2px 3px; letter-spacing:3px; font-weight:bolder; } .unchanged { border:0; } </style>
--script 脚本--
<script language="javascript" type="text/javascript"> var code ; //在全局 定义验证码 function createCode(){ code = ""; var codeLength = 4;//验证码的长度 var checkCode = document.getElementById("checkCode"); checkCode.value = ""; var selectChar = new Array(1,2,3,4,5,6,7,8,9,
'A','B','C','D','E',
'F','G','H','J','K',
'L','M','N','P','Q',
'R','S','T','U','V',
'W','X','Y','Z'); for(var i=0;i<codeLength;i++) { var charIndex = Math.floor(Math.random()*32); code +=selectChar[charIndex]; } if(code.length != codeLength){ createCode(); } checkCode.value = code; } function validate () { var inputCode = document.getElementById("input1").value.toUpperCase(); if(inputCode.length <=0) { alert("请输入验证码!"); return false; } else if(inputCode != code ){ alert("验证码输入错误!"); createCode(); return false; } else { alert("OK"); return true; } } </script>
--页面代码--
<body onload="createCode()">
<input type="text" id="input1" /> <input type="text" id="checkCode" class="code" style="width: 55px" /> <a href="#" onclick="createCode()">看不清楚</a><br /><br /> <center> <input id="Button1" onclick="validate();"/>
</center>
</body>