驗證碼技術的主要技術入口是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);
}
}