大家都知道,验证码的出现无非就是为了安全期间,防止非法操作!
这其实没什么技术可言,用到的事java绘画中的一些知识而已~~其实验证码各式各样多得很,实现方式五花八门,大家可以自己去研究一下!
废话不多说了,在这里给出的的一个项目中用到的一个例子~~~~
验证码生成程序:
checkCodeServlet.java
package servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class checkCodeServlet extends HttpServlet {
private static int WIDTH=60;
private static int HEIGHT=20;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session=request.getSession();
response.setContentType("image/jpeg");
ServletOutputStream sos=response.getOutputStream();
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//创建内存图像,并获得其图形上下文
BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
char [] rands=generateCheckCode();
drawBackground(g);
drawRands(g,rands);
g.dispose();
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] buf=bos.toByteArray();
response.setContentLength(buf.length);
sos.write(buf);
bos.close();
sos.close();
session.setAttribute("check_code", new String(rands));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
private char[] generateCheckCode(){
String chars="0123456789abcdefghijklmnopqrstuvwxyz";
char [] rands =new char[4];
for(int i=0;i<4;i++){
int rand=(int)(Math.random()*36);
rands[i]=chars.charAt(rand);
}
return rands;
}
//输出 而我I有干扰元素的验证码
private void drawRands(Graphics g,char[] rands){
g.setColor(Color.black);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));
//在不同的高度上输出验证码的每个字符
g.drawString(""+rands[0], 1,17);
g.drawString(""+rands[1], 16,15);
g.drawString(""+rands[2], 31,18);
g.drawString(""+rands[3], 46,16);
System.out.println(rands);
}
//输出有干扰元素的验证码
private void drawBackground(Graphics g){
//画背景
g.setColor(new Color(0xDCDCDC));
g.fillRect(0,0, WIDTH,HEIGHT);
//随机产生20个干扰点
for(int i=0;i<20;i++){
int x=(int)(Math.random()*WIDTH);
int y=(int)(Math.random()*HEIGHT);
int red=(int)(Math.random()*255);
int green=(int)(Math.random()*255);
int blue=(int)(Math.random()*255);
g.setColor(new Color(red,green,blue));
g.drawOval(x,y,1,0);
}
}
}
code.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>显示验证码</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" language="javascript">
function change(){
// alert("wwwwwwwwwwwwww");
var chg=document.getElementById("code");
chg.innerHTML="<img src='checkCodeServlet'>";
}
</script>
</head>
<body>
<form action="loginServlet" method="post">
<input type="text" name="name"><br>
<input type="password" name="password"><br>
<input type="text" name="code" >
<span id="code" bgcolor="red" οnclick="change()"><img src="checkCodeServlet"></span><br>
<input type="submit" value="登录">
</form>
</body>
</html>
loginServlet.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class loginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String code=request.getParameter("code");
PrintWriter out=response.getWriter();
HttpSession session=request.getSession();
String check_code=session.getAttribute("check_code").toString();
if(code.equals(check_code)){
out.println("验证码正确!!"+check_code);
return;
}
out.println("验证码错误!!应该为:"+check_code);
}
}
servlet的配置文件在这里就不再贴出了~~~·
当然,code.html文件中点击验证码是会自动变换的(存在浏览器兼容问题),如果想点击验证码不变换的话,可以将script的代码和<span>代码去掉即可!!
运行截图如下: