您的位置:首页 > Web前端 > JavaScript

jsp实现验证码实例

2013-12-11 20:38 232 查看
大家都知道,验证码的出现无非就是为了安全期间,防止非法操作!

这其实没什么技术可言,用到的事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" onclick="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>代码去掉即可!!

 

运行截图如下:

 





 

 



 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  验证码 js