验证码技术的主要技术入口是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.BufferedImage
public 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{
@Override
protected 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:向客户端发的消息
*/
@Override
protected 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);
}
}