Created
August 2, 2016 01:39
-
-
Save sheldonshen/0eb0dffd768726accab5971621c17e5f to your computer and use it in GitHub Desktop.
image validation code generation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.Color; | |
import java.awt.Font; | |
import java.awt.Graphics2D; | |
import java.awt.image.BufferedImage; | |
import java.util.Random; | |
import javax.imageio.ImageIO; | |
import javax.servlet.ServletException; | |
import javax.servlet.ServletOutputStream; | |
import javax.servlet.http.HttpServlet; | |
import javax.servlet.http.HttpServletRequest; | |
import javax.servlet.http.HttpServletResponse; | |
import javax.servlet.http.HttpSession; | |
public class RandomCodeServlet extends HttpServlet { | |
private static final long serialVersionUID = 1L; | |
//驗證碼圖片的寬度 | |
private int width=85; | |
//驗證碼圖片的高度 | |
private int height=20; | |
//隨機的字數 | |
private int codeCount=4; | |
private int x=0; | |
//字體的高度 | |
private int fontHeight; | |
private int codeY; | |
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', | |
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', | |
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; | |
public void init() throws ServletException{ | |
//字體寬度 | |
String strWidth=this.getInitParameter("width"); | |
//字體的高度 | |
String strHeight=this.getInitParameter("height"); | |
//字體的字數 | |
String strCodeCount=this.getInitParameter("codeCount"); | |
//逕行判斷 | |
try{ | |
if(strWidth!=null && strWidth.length()!=0){ | |
width=Integer.parseInt(strWidth); | |
} | |
if(strHeight!=null && strHeight.length()!=0){ | |
height=Integer.parseInt(strHeight); | |
} | |
if(strCodeCount!=null && strCodeCount.length()!=0){ | |
codeCount=Integer.parseInt(strCodeCount); | |
} | |
}catch(NumberFormatException e){ | |
e.printStackTrace(); | |
} | |
x=width/(codeCount+2); | |
fontHeight=height-2; | |
codeY=height-4; | |
} | |
protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, java.io.IOException { | |
BufferedImage buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); | |
Graphics2D g = buffImg.createGraphics(); | |
//創建一個隨機器生成器類 | |
Random random = new Random(); | |
g.setColor(Color.WHITE); | |
g.fillRect(0, 0, width, height); | |
//創建字體,字體的大小隨圖片的高度來定 | |
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight); | |
//設置字體 | |
g.setFont(font); | |
//畫邊框 | |
g.setColor(Color.BLACK); | |
g.drawRect(0, 0, width - 1, height - 1); | |
//隨機產生160條干擾線,是圖像中的驗證碼不易被其他程序探測到 | |
g.setColor(Color.GRAY); | |
for(int i = 0; i<160; i++) { | |
int x = random.nextInt(width); | |
int y = random.nextInt(height); | |
int xl = random.nextInt(1); | |
int yl = random.nextInt(1); | |
g.drawLine(x, y, x + xl, y + yl); | |
} | |
//randomCodeç用於保存隨機產生的驗證碼,以便於用戶注冊時逕行驗證 | |
StringBuffer randomCode = new StringBuffer(); | |
int red = 0, green = 0, blue = 0; | |
//隨機產生4位數字的驗證碼 | |
for (int i = 0; i<codeCount; i++) { | |
//得到隨機產生的驗證碼數字 | |
String strRand = String.valueOf(codeSequence[random.nextInt(36)]); | |
//產生隨機的顏色分量來構造顏色值,這樣輸出的每位數字的顏色值都將不同 | |
red = random.nextInt(110); | |
green = random.nextInt(50); | |
blue = random.nextInt(50); | |
//用隨機產生的顏色將驗證碼會知道圖像中 | |
g.setColor(new Color(red, green, blue)); | |
g.drawString(strRand, (i + 1) * x, codeY); | |
//將產生的四個隨機數組合在一起 | |
randomCode.append(strRand); | |
} | |
// 將產生的隨機數存貯在session中 | |
HttpSession session = req.getSession(); | |
//resp.addHeader("P3P", "CP=CAO PSA OUR"); | |
//resp.setHeader("P3P","CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'"); | |
session.removeAttribute("validateCode"); | |
session.setAttribute("validateCode", randomCode.toString()); | |
// 禁止圖像緩存 | |
resp.setHeader("Pragma", "no-cache"); | |
resp.setHeader("Cache-Control", "no-cache"); | |
resp.setDateHeader("Expires", 0); | |
resp.setContentType("image/jpeg"); | |
//將圖像輸出的servlet流中 | |
ServletOutputStream sos = resp.getOutputStream(); | |
ImageIO.write(buffImg, "jpeg", sos); | |
sos.close(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
generated a random 4 numbers and letters virification code