驗證碼的生成的實現

驗證碼的生成的實現javascript

package Servlet;



import java.awt.Color;
import java.awt.Font;
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 Code_MarkerServlet 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 {
		// 首先設置頁面不緩存--最後加上
		response.setHeader("Pragma", "No-cache");  // 設置HTTP響應的頭信息
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		// 定義圖片的寬度和高度
		int width = 90, height = 40;
		// 建立一個圖像對象
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		/**
		 * component類及其子類在新生成對象的時候會自動調用paint(Graphics g)方法
		 */
		Graphics g = image.createGraphics();// 獲得圖像的繪製環境
		
		// 用隨機顏色填充圖像背景
		g.setColor(getRandColor(180, 250));
		/**
		 * fillRect(x,y,w,h)函數的做用是:填充一個矩形區域,x、y爲起始座標(即左上角座標),
		 * 後面兩個參數分別爲:w、h,是矩形區域的寬和高,這裏的20表示填充寬度20像素,15表示填充高度15像素。
若有其它不懂的地方能夠在線問我。
		 */
		g.fillRect(0, 0, width, height);
		Random random = new Random();
		for (int i = 0; i < 6; i++) {
			g.setColor(getRandColor(50, 100));
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			/**
			 * fillRect(x,y,w,h)函數的做用是:填充一個矩形區域,x、y爲起始座標(即左上角座標),
			 * 後面兩個參數分別爲:w、h,是矩形區域的寬和高,這裏的20表示填充寬度20像素,
			 * 15表示填充高度15像素。
			 */
			g.drawOval(x, y, 5, 5);
		}
		g.setFont(new Font("", Font.PLAIN, 40)); // 設置字體,下面準備畫隨機數
		String sRand = ""; // 隨機數字符串
		for (int i = 0; i < 4; i++) {
			// 生成四個數字字符
			String rand = String.valueOf(random.nextInt(10));
			sRand += rand;
			// 生成隨機顏色
			g.setColor(new Color(20 + random.nextInt(80), 20 + random
					.nextInt(100), 20 + random.nextInt(90)));
			// 將隨機數字畫在圖像上
			
			/**
			 * drawString 
public abstract void drawString(AttributedCharacterIterator iterator, 
int x, 
int y) 
使用此圖形上下文的當前顏色繪製由指定迭代器給定的文本。迭代器必須爲每一個字符指定字體。最左側字符的基線位於此圖形上下文座標系統的 (x, y) 位置處。 

參數: 
iterator - 要繪製其文本的迭代器 
x - x 座標。 
y - y 座標。 
另請參見: 
drawBytes(byte[], int, int, int, int), drawChars(char[], int, int, int, int)
			 * 
			 */
			g.drawString(rand, (17 + random.nextInt(3)) * i + 8, 34);

			// 生成干擾線
			for (int k = 0; k < 12; k++) {
				int x = random.nextInt(width);
				int y = random.nextInt(height);
				int xl = random.nextInt(9);
				int yl = random.nextInt(9);
				/**
				 * 這個方法是畫一條直線,那麼咱們都知道兩點肯定一條直線,而在座標中由橫(X)、縱座標(y)肯定一個點,這四參數實際就是肯定兩個點,你要畫的直線的起始點橫縱座標和終點的橫縱座標。
X1,Y1是肯定直線的起始點,即橫座標爲x1,縱座標爲y1的點。同理x2,y2肯定直線的終點。
例A(x1,y1)  B(x2,y2) 就能夠畫出直線AB了
				 * 
				 * 
				 * 
				 * public abstract void drawLine(int x1,
                              int y1,
                              int x2,
                              int y2)在此圖形上下文的座標系統中,使用當前顏色在點 (x1, y1) 和 (x2, y2) 之間畫一條線。 

參數:
x1 - 第一個點的 x 座標。
y1 - 第一個點的 y 座標。
x2 - 第二個點的 x 座標。
y2 - 第二個點的 y 座標。

譬如,你從(0,0, 100, 200),就是從畫一條從(0,0)點開始向目標點(100,200)的直線
				 * 
				 * 
				 */
				g.drawLine(x, y, x + xl, y + yl);
			}
		}

		// 將生成的隨機數字字符串寫入session
		request.getSession().setAttribute("randomNumber", sRand);
		g.dispose(); // 使圖像生效
		ImageIO.write(image, "JPEG", response.getOutputStream()); // 輸出圖像到頁面
	}

	// 產生一個隨機的顏色 其中,min:顏色份量最小值 ;max:顏色份量最大值
	public Color getRandColor(int min, int max) {
		Random random = new Random();
		if (min > 255) {
			min = 255;
		}
		if (max > 255) {
			max = 255;
		}
		int R = min + random.nextInt(max - min);
		int G = min + random.nextInt(max - min);
		int B = min + random.nextInt(max - min);
		/**
		 * 0~255   蘭色:0~7 位       綠色:8~15位        紅色:16~23位
		 */
		return new Color(R, G, B);
	}

}

  

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<script type="text/javascript">
  location.href="ImageCode.jsp";
</script>


======================================================
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>驗證碼示例</title>
	</head>
	<%
	String contextPath = request.getContextPath();
	%>
	<body>
		<form name="form1" method="post" action="">
			<center>
				<font style="FONT-SIZE:20px;COLOR:#FF6347"><B>登 陸</B> </font>
			</center>
			<table width="50%" height="30%" border="1" align="center"
				cellpadding="0" cellspacing="0" bgcolor=#F8F8FF bordercolor=#A020F0>
				<tr>
					<th>
						<font style="FONT-SIZE:15px;COLOR:#FF8000">用戶名:</font>
					</th>
					<td align="left">
						<input name="username" type="text">
					</td>
				</tr>
				<tr>
					<th>
						<font style="FONT-SIZE:15px;COLOR:#FF8000">登錄密碼:</font>
					</th>
					<td align="left">
						<input name="password" type="text">
					</td>
				</tr>
				<tr>
					<th>
						<font style="FONT-SIZE:15px;COLOR:#FF8000">輸入驗證碼:</font>
					</th>
					<td align="left">

						<input name="randomNumber" type="text">
						<IMG id="img1" src="<%=contextPath%>/Code_MarkerServlet"
							height=40 width=90> 
						<input type="button" name="Submit" value="換一個" onclick="aa()">
					</td>
				</tr>
				<tr>
					<td align="center" colspan="2">
						<input type="submit" name="Submit" value="進 入">
					</td>
				</tr>
			</table>
		</form>
		<script type="text/javascript">
		function aa(){
		     document.getElementById("img1").src="<%=contextPath%>/Code_MarkerServlet";
		     form1.submit();
		}
		</script>
	</body>
</html>


====================================================
Web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	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_2_5.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>Code_MarkerServlet</servlet-name>
    <servlet-class>Servlet.Code_MarkerServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Code_MarkerServlet</servlet-name>
    <url-pattern>/Code_MarkerServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
相關文章
相關標籤/搜索