J2EE驗證碼圖片若何生成和點擊刷新驗證碼。本站提示廣大學習愛好者:(J2EE驗證碼圖片若何生成和點擊刷新驗證碼)文章只能為提供參考,不一定能成為您想要的結果。以下是J2EE驗證碼圖片若何生成和點擊刷新驗證碼正文
驗證碼圖片生成步調
創立BufferedImage對象。
獲得BufferedImage的畫筆,即挪用getGraphics()辦法獲得Graphics對象。
挪用Graphics對象的setColor()辦法和fillRect()辦法設置圖片配景色彩。
挪用Graphics對象的setColor()辦法和drawLine()辦法設置圖片攪擾線。
挪用BufferedImaged對象的setRGB()辦法設置圖片的噪點。
挪用Graphics對象的setColor()辦法、setFont()辦法和drawString()辦法設置圖片驗證碼。
由於驗證碼的圖片的寬度和高度要依據網站的作風來肯定的,所以字體的年夜小須要依據圖片的寬度和高度來肯定,用到了小小的技能。
package util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
public class Verification {
private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
/**
* 生成一個寬為width, 高為height, 驗證碼為code的圖片
* @param width 圖片的寬
* @param height 圖片的高
* @param code 驗證碼字符串
* @return 前往圖片驗證碼
*/
public static BufferedImage getImage(int width, int height, String code){
return getImage(width, height, code, 20);
}
/**
* 生成一個寬為width, 高為height, 驗證碼為code的圖片,圖片中攪擾線的條數為lineCnt
* @param width 圖片的寬
* @param height 圖片的高
* @param code 驗證碼字符串
* @param lineCnt 攪擾線的條數,建議為10條閣下,可依據成果恰當調劑
* @return 前往圖片驗證碼
*/
public static BufferedImage getImage(int width, int height, String code, int lineCnt){
return createImage(width, height, code, lineCnt, 0.01);
}
/**
* 生成一個寬為width, 高為height, 驗證碼為code的圖片,圖片中攪擾線的條數為lineCnt
* 噪聲比為noiseRate,即圖片中樂音像素點的百分比
* @param width 圖片的寬
* @param height 圖片的高
* @param code 驗證碼字符串
* @param lineCnt 攪擾線的條數,建議為10條閣下,可依據成果恰當調劑
* @param noiseRate 圖片中樂音像素點占總像素的百分比
* @return 前往圖片驗證碼
*/
public static BufferedImage getImage(int width, int height, String code, int lineCnt, double noiseRate){
return createImage(width, height, code, lineCnt, noiseRate);
}
/**
*
* 生成一個寬為width, 高為height, 驗證碼為code的圖片,圖片中攪擾線的條數為lineCnt
* 噪聲比為noiseRate,即圖片中樂音像素點的百分比
* @param width 圖片的寬
* @param height 圖片的高
* @param code 驗證碼字符串
* @param lineCnt 攪擾線的條數,建議為10條閣下,可依據成果恰當調劑
* @param noiseRate 圖片中樂音像素點占總像素的百分比
* @return 前往圖片驗證碼
*/
private static BufferedImage createImage(int width, int height, String code, int lineCnt, double noiseRate){
int fontWidth = ((int)(width * 0.8)) / code.length();
int fontHeight = (int)(height * 0.7);
//為了在隨意率性的width和height下都能生成優越的驗證碼,
//字體的年夜小為fontWdith何fontHeight中的小者,
int fontSize = Math.min(fontWidth, fontHeight);
//drawString時要用到
int paddingX = (int) (width * 0.1);
int paddingY = height - (height - fontSize) / 2;
//創立圖象
BufferedImage buffimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//取得畫筆
Graphics g = buffimg.getGraphics();
//設置畫筆的色彩
g.setColor(getRandColor(200, 255));
//然後填充一個矩形,即設置配景色
g.fillRect(0, 0, width, height);
// 設置攪擾線
for (int i = 0; i < lineCnt; i++) {
//隨機獲得攪擾線的終點和起點
int xs = (int)(Math.random() * width);
int ys = (int)(Math.random() * height);
int xe = (int)(Math.random() * width);
int ye = (int)(Math.random() * height);
g.setColor(getRandColor(1, 255));
g.drawLine(xs, ys, xe, ye);
}
// 添加噪點
int area = (int) (noiseRate * width * height);
for(int i=0; i<area; ++i){
int x = (int)(Math.random() * width);
int y = (int)(Math.random() * height);
buffimg.setRGB(x, y, (int)(Math.random() * 255));
}
//設置字體
Font font = new Font("Ravie", Font.PLAIN, fontSize);
g.setFont(font);
for(int i=0; i<code.length(); ++i){
String ch = code.substring(i, i+1);
g.setColor(getRandColor(1, 199));
g.drawString(ch, paddingX + fontWidth * i, paddingY);
}
return buffimg;
}
/**
* 獲得隨機的色彩,r,g,b的取值在L到R之間
* @param L 左區間
* @param R 右區間
* @return 前往隨機色彩值
*/
private static Color getRandColor(int L, int R){
if(L > 255)
L = 255;
if(R > 255)
R = 255;
if(L < 0)
L = 0;
if(R < 0)
R = 0;
int interval = R - L;
int r = L + (int)(Math.random() * interval);
int g = L + (int)(Math.random() * interval);
int b = L + (int)(Math.random() * interval);
return new Color(r, g, b);
}
/**
* 隨機生成若干個由年夜小寫字母和數字構成的字符串
* @param len 隨機生成len個字符
* @return 前往隨機生成的若干個由年夜小寫字母和數字構成的字符串
*/
public static String getRandCode(int len){
String code = "";
for(int i=0; i<len; ++i){
int index = (int)(Math.random() * ALPHABET.length());
code = code + ALPHABET.charAt(index);
}
return code;
}
/**
* 將圖片轉為byte數組
* @param image 圖片
* @return 前往byte數組
* @throws IOException
*/
public static byte[] getByteArray(BufferedImage image) throws IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
return baos.toByteArray();
//ByteArrayOutputStream 不須要close
}
}
應用驗證碼圖片
在verificationCode.java這個servlet中挪用下面的類生成驗證碼圖片,然後將圖片前往給客戶端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//隨機生成字符串,並寫入session
String code = Verification.getRandCode(4);
session.setAttribute("verification", code);
BufferedImage image = util.Verification.getImage(100,30, code, 5);
response.setContentType("image/png");
OutputStream out = response.getOutputStream();
out.write(util.Verification.getByteArray(image));
out.flush();
out.close();
}
在index.jsp中設置驗證碼,用戶點擊驗證碼時,挪用js代碼要求辦事器獲得新的驗證碼。由於下面的誰人生成驗證碼的servlet會被閱讀器緩存,所以js代碼中須要給該servlet一個隨機的參數,如許閱讀器就會向辦事器發要求獲得新的驗證碼,而不是去緩存中讀取。
<%@page import="util.Verification"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function refreshcode(){
document.getElementById("verification").src= "/verificationCode/verificationCode?hehe="+Math.random();
}
</script>
</head>
<body>
<form action="<%=request.getContextPath()+"/checkVerification" %>" method="post">
驗證碼:<input type="text" name="submitVerification">
<img id="verification" alt="" title="看不盤點擊刷新驗證碼" src="<%=request.getContextPath()+"/verificationCode" %>"
onclick="refreshcode()"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
最初是在checkVerification.java這個servlet中斷定用戶輸出的驗證碼能否准確,為了便利用戶,驗證碼普通都設置成年夜小寫不敏感,所以要先轉化為小寫字母再比對。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String verification = (String)session.getAttribute("verification");
String submitVerification = request.getParameter("submitVerification");
PrintWriter out = response.getWriter();
if(verification!=null && submitVerification!=null){
if(verification.toLowerCase().equals(submitVerification.toLowerCase())){
out.println("yes!!!");
}
else{
out.println("no!!!");
}
}
else{
out.println("no!!!");
}
session.removeAttribute("verification");//避免用戶反復提交表單
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
最初運轉的後果圖以下
以上就是本文的全體內容,願望對年夜家的進修有所贊助。