验证码技术(BufferedImage)

来源:互联网 发布:c 高级编程第10版教程 编辑:程序博客网 时间:2024/06/06 12:45

验证码技术的主要技术入口是java.awt.image.BufferedImage类:

通过public GraphicsgetGraphics()  此方法返回Graphics2D

package cn.hncu.demo;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import org.junit.Test;public class ImageCodeDemo {@Test//把字符串"hello"变成图片写入到图片文件中 --技术入口:java.awt.image.BufferedImagepublic void demo1() throws FileNotFoundException, IOException{//定义图片的宽、高int w=60;int h=30;//创建一个内存图片BufferedImage img=new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);//获取 Graphics对象Graphics g = img.getGraphics();g.drawString("hello", 0, 30);//让图形生效(把g对象刷到img中)g.dispose();//把内存图片img输出到一个文件中ImageIO.write(img, "JPEG", new FileOutputStream("./1.jpg"));}@Test//把生成4个数字的验证码写到图片中public void demo2() throws FileNotFoundException, IOException{//创建一个内存图片BufferedImage img=new BufferedImage(60, 30, BufferedImage.TYPE_INT_RGB);//获取Graphic对象Graphics g = img.getGraphics();//设置背景色g.setColor(Color.WHITE);g.fillRect(0, 0, 60, 30);Random r=new Random();for(int i=0;i<4;i++){int a=r.nextInt(10);//生成0-9之间的一个数字int y=10+r.nextInt(20);//y坐标随机//每个数字不同的颜色g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));g.drawString(a+"", i*10, y);}//话干扰线for(int i=0;i<10;i++){g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));g.drawLine(10+r.nextInt(60), 5+r.nextInt(30), 10+r.nextInt(60), 5+r.nextInt(30));}//让图片生效g.dispose();//把内存图片写入到文件中ImageIO.write(img, "JPEG", new FileOutputStream("./2.jpg"));}}
1.jpg:


2.jpg



下面使用前端加后台的形式:

1:index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>        <title>开始学习后台</title>  </head>    <body>  <h1>开始学习后台的第一个页面</h1>  <h1>开始学习后台的第一个页面</h1>  <h1>开始学习后台的第一个页面</h1>  <h1>开始学习后台的第一个页面</h1>  <a href="jsps/2.jsp">第二个</a>  <a href="aa">aa</a>  <hr/>    <a href="one?name=dragon&age=21">使用serlet--用java写的一个类</a>  <br/>  <form action="one" method="post">  name:<input type="text" name="name"/><br/>  age:<input type="text" name="age"/>  验证码:<input type="text" name="code"/> <img id="img1" src="h"> <a href="javascript:changeImage();">看不清</a>  <input type="submit" value="登录">  </form>    <script type="text/javascript">  function changeImage(){  var oImg=document.getElementById("img1");  var t = new Date().getTime();  oImg.src="h?"+t;  }    </script>    </body></html>
2:web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  <display-name></display-name>    <servlet>  <servlet-name>hello3</servlet-name>  <jsp-file>/WEB-INF/aa/3.jsp</jsp-file>  </servlet>  <servlet>  <servlet-name>one</servlet-name>  <servlet-class>cn.hncu.serlet.OneSerlet</servlet-class>  </servlet>  <servlet>  <servlet-name>hCode</servlet-name>  <servlet-class>cn.hncu.serlet.ImageCodeSevlet</servlet-class>  </servlet>        <servlet-mapping>  <servlet-name>hCode</servlet-name>  <url-pattern>/h</url-pattern>  </servlet-mapping>  <servlet-mapping>  <servlet-name>hello3</servlet-name>  <!-- 注意,映射路径不能以/WEB-INF开头,因为这是安全路径 -->  <url-pattern>/aa</url-pattern>  </servlet-mapping>  <servlet-mapping>  <servlet-name>one</servlet-name>  <url-pattern>/one</url-pattern>  </servlet-mapping>    <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>
ImageCodeSevlet.java

package cn.hncu.serlet;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ImageCodeSevlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//创建一个内存图片BufferedImage img=new BufferedImage(60, 30, BufferedImage.TYPE_INT_RGB);//获取Graphic对象Graphics g = img.getGraphics();//设置背景色g.setColor(Color.WHITE);g.fillRect(0, 0, 60, 30);Random r=new Random();for(int i=0;i<4;i++){int a=r.nextInt(10);//生成0-9之间的一个数字int y=10+r.nextInt(20);//y坐标随机//每个数字不同的颜色g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));g.drawString(a+"", i*10, y);}//话干扰线for(int i=0;i<10;i++){g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));g.drawLine(r.nextInt(60), r.nextInt(30), r.nextInt(60), r.nextInt(30));}//让图片生效g.dispose();//把图片输入到网络ImageIO.write(img, "JPEG", resp.getOutputStream());}}
OneSerlet.java

package cn.hncu.serlet;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;public class OneSerlet extends HttpServlet{/** * Request:客户端上传的消息 * Response:向客户端发的消息 */@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("一个服务来了");//从客户端接收上传的参数String name=req.getParameter("name");String age=req.getParameter("age");System.out.println("name:"+name+",age:"+age);//向客户端发送应答消息//resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=utf-8");PrintWriter pw = resp.getWriter();pw.println("第一次服务。");pw.println("您输入的信息是:"+"name:"+name+",age:"+age);}}






原创粉丝点击