jsp实现验证码实例

来源:互联网 发布:火爆网络兔子舞 编辑:程序博客网 时间:2024/06/05 04:02

大家都知道,验证码的出现无非就是为了安全期间,防止非法操作!

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

 

运行截图如下:

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击